我已经尝试了几个小时才能做到这一点,我似乎无法做到这一点......
给定一个字符串
"xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\""
"保存"正确表达式是什么? http://www.openarchives.org/OAI/2.0/oai-identifier
位?
提前致谢,确实无法做到这一点。
String validXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><feed "
+ "xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\" "
+ "xmlns:mingo-identifier=\"http://www.google.com\" "
+ "xmlns:abeve-identifier=\"http://www.news.ycombinator.org/OAI/2.0/oai-identifier\">"
+ "</feed>";
Pattern p = Pattern.compile(".*\\\"(.*)\\\".*");
Matcher m = p.matcher(validXML);
System.out.println(m.group(1));
不打印任何东西。请注意,这个尝试只是为了将字符串放在引号内,一旦我开始工作,我就会担心另一部分......糟糕的是我从来没有这样做过。感谢
答案 0 :(得分:2)
正则表达式非常昂贵 - 当您不需要时,请不要使用它们!还有一百万种其他方法可以解析字符串。
String validXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><feed "
+ "xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\" "
+ "xmlns:mingo-identifier=\"http://www.google.com\" "
+ "xmlns:abeve-identifier=\"http://www.news.ycombinator.org/OAI/2.0/oai-identifier\">"
+ "</feed>";
String start = "xmlns:oai-identifier=\"";
String end = "\" ";
int location = validXml.indexOf(start);
String result;
if (location > 0) {
result = validXml.substring(location + start.length(), validXml.length());
int endIndex = result.indexOf(end);
if (endIndex > 0) {
result = result.substring(0, endIndex);
}
else {
throw new Exception("Could not find end!");
}
}
else {
throw new Exception("Could not find start!");
}
System.out.println(result);
答案 1 :(得分:2)
由于您正在阅读XML,因此可能正在使用DOM,因此在解析文档并将lookupNamespaceURI()
选项设置为{{1}时,可以使用setNamespaceAware()
从前缀名称中提取命名空间}:
true
它更简单,你不必进行任何字符串解析。
答案 2 :(得分:1)
我认为问题可能是您的正则表达式中的第一个.*
过于急切并且匹配的字符比您想要的多。
尝试将".*\\\"(.*)\\\".*"
更改为"xmlns.*=\"(.*)\".*"
,看看是否有效。
如果它最初不起作用,您还可以尝试重新启动引用转义。在我的头脑中,我认为你不需要它们逃脱,但我不是百分百肯定。
另请注意,这只会匹配单个名称空间声明,而不是示例中validXML
变量中的每个名称空间声明。您必须拆分字符串才能在任意数量的xmlns:.*=
属性上使用它。