我正在制作一些正则表达式,我想知道为什么这个正则表达式
"(?<=(.*?id(( *)=)\\s[\"\']))g"
与字符串
不匹配<input id = "g" />
在Java中?
答案 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内的无限重复