使用正则表达式无法匹配字符串

时间:2010-10-06 20:40:06

标签: java regex

我正在制作一些正则表达式,我想知道为什么这个正则表达式

"(?<=(.*?id(( *)=)\\s[\"\']))g"

与字符串

不匹配
<input id = "g" />
在Java中

4 个答案:

答案 0 :(得分:6)

Java.util.regex不支持无限后卫,如RegexBuddy所述:

  

坏消息是大多数正则表达式   味道不允许你只使用   在lookbehind里面的任何正则表达式,因为   他们不能应用正则表达式   向后。因此,经常   表达引擎需要能够   弄清楚要退后几步   在检查外观之前。

从文档中添加一些说明:

  

因此,许多正则表达式的味道,   包括Perl和   Python,只允许固定长度   字符串。你可以使用任何正则表达式   匹配的长度可以是   预定的。这意味着你可以使用   文字文本和字符类。   您不能使用重复或可选   项目。你可以使用交替,但是   只有在交替中的所有选项   长度相同。

     

一些正则表达式,如PCRE和Java   支持上述,加上交替   用不同长度的字符串。   交替的每个部分必须   仍然有一个有限的最大长度。   这意味着您仍然无法使用   明星或加号,但你可以使用   问号和花括号   指定了max参数。   这些正则表达式的味道认识到了这一事实   那有限的重复可以   重写为字符串的替换   具有不同但固定的长度。   不幸的是,JDK 1.4和1.5   你使用时会有一些错误   里面的交替变换。这些   已在JDK 1.6中修复。

答案 1 :(得分:2)

所以有几个人已经解释了为什么你的正则表达式不起作用(而且它确实是致命的; Java正则表达式不能满足你的需要)。但是,您可能想知道现在应该如何解析这个......

看起来你要解析的字符串是XML。 Regex实际上不是解析XML的好方法; XML中可编码的内容与使用正则表达式匹配的内容之间存在不匹配。因此,如果这是某些XML文本的一部分,可以考虑将其分解为XML解析器,然后您可以查询不同的元素。

有关此问题的冷静和合理的讨论,请参阅此经典的stackoverflow帖子:RegEx match open tags except XHTML self-contained tags

希望这有帮助!

答案 2 :(得分:2)

Java不仅不允许无限制的lookbehind,如果你尝试,它应该抛出异常。您没有看到该例外的事实是itself a bug

无论如何你不应该使用lookbehind。如果要匹配某个属性的值,最简单,最麻烦的方法是匹配整个属性并使用捕获组来提取值。例如:

String source = "<input id = \"g\" />"; 
Pattern p = Pattern.compile("\\bid\\s*=\\s*\"([^\"]*)\"");
Matcher m = p.matcher(source);
if (m.find())
{
  System.out.printf("Found 'id' attribute '%s' at position %d%n",
                    m.group(1), m.start());
}

输出:

Found 'id' attribute 'g' at position 7

帮自己一个忙,暂时忘掉看后卫。即使他们没有马车,它们也很棘手,而且它们真的没有你想象的那么有用。

答案 3 :(得分:0)

java.util.regex不支持lookbehind内的无限重复