在java中,尝试使用正则表达式提取XMLN

在java中,尝试使用正则表达式提取XMLN,java,regex,xml,string,xml-namespaces,Java,Regex,Xml,String,Xml Namespaces,我已经试了几个小时来纠正这个错误,但我似乎真的做不到 给一串 "xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\"" “保存”代码的正确表达式是什么http://www.openarchives.org/OAI/2.0/oai-identifierbit 提前谢谢,真的很难做到这一点 String validXML = "<?xml version=\"1.0\" encoding=\"U

我已经试了几个小时来纠正这个错误,但我似乎真的做不到

给一串

"xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\""
“保存”代码的正确表达式是什么http://www.openarchives.org/OAI/2.0/oai-identifierbit

提前谢谢,真的很难做到这一点

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));
String validXML=“”
+ "";
Pattern p=Pattern.compile(“.\\\”(.*)\\\”*”);
匹配器m=p.Matcher(validXML);
系统输出println(m.group(1));

没有打印出任何东西。请注意,这次尝试只是为了将字符串放在引号内,我会担心另一部分,一旦我开始工作。。。糟糕的是,我从来没有让它工作过。谢谢

我想问题可能是正则表达式中的第一个
*
太过急切,匹配的字符比您想要的多

尝试将
“*\ \”(.*)\\“*”
更改为
“xmlns.*=\”(.*)\“*”
,然后查看是否有效

如果一开始不起作用,您也可以尝试重新恢复报价转义。在我脑海里,我想你不需要他们逃跑,但我不是100%确定


还要注意,这将只匹配单个名称空间声明,而不是示例中
validXML
变量中的每个名称空间声明。您必须拆分字符串,才能在任意数量的
xmlns:.*=
属性上使用它。

正则表达式非常昂贵-不需要时不要使用它们!!还有一百万种其他方法可以解析字符串

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);
String validXml=“”
+ "";
String start=“xmlns:oai标识符=\”;
字符串结束=“\”;
int location=validXml.indexOf(开始);
字符串结果;
如果(位置>0){
结果=validXml.substring(location+start.length(),validXml.length());
int endIndex=result.indexOf(end);
如果(endIndex>0){
结果=结果.子字符串(0,endIndex);
}
否则{
抛出新异常(“找不到结束!”);
}
}
否则{
抛出新异常(“找不到开始!”);
}
系统输出打印项次(结果);

由于您正在阅读XML,因此可能正在使用DOM,因此在解析文档时,只要将
setNamespaceAware()
选项设置为
true
,就可以使用
lookupNamespaceURI()
从前缀名称中提取名称空间:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Document doc = factory.newDocumentBuilder().parse(new InputSource(new StringReader(validXML)));

String namespace = doc.lookupNamespaceURI("oai-identifier");

它更简单,而且您不必进行任何字符串解析。

“真的很难做到这一点”我们可以看看您解决此问题的尝试吗?当然,我的尝试,即仅提取引号中的内容,在我发现这一点后,会担心XMLN。谢谢你格式化我的帖子,长时间潜伏者,第二次海报:)好的,我把字符串拆分成一个string[]对象,包含3个元素…:oai identifier=”“:mingo identifier=“:abeve identifier=”现在我只想把东西放在“然后将该信息添加到数组中,对吗?是的,您可以通过循环数组来执行此操作。”。但是,如果你正在考虑做更多的XML解析,那么你应该考虑在@ HeldDAROCH的答案中概述的方法。这绝对是一个比使用定制的正则表达式更好的方法。字符串[]splits=xml.split(“xmlns”);对于(ints=1;s