- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能一步一步地向我解释为什么正则表达式会失败:
<.++>
与此字符串进行比较:<em>
使用惰性或贪婪量词找到相同的字符串,但在这种情况下涉及哪些步骤?
我使用 Java 正则表达式风格。
最佳答案
来自Java Pattern
documentation :
Possessive quantifiers, which greedily match as much as they can and do not back off, even when doing so would allow the overall match to succeed.
在您的示例中,<
在你的正则表达式中匹配 <
在字符串中,然后是 .++
匹配字符串的其余部分 em>
.你还有一个 >
在您的正则表达式中,但字符串中没有剩余字符可以匹配(因为 .++
消耗了所有字符)。所以匹配失败。
如果量词是贪心的,即如果它是 .+
而不是 .++
, 此时正则表达式引擎会尝试减少 .+
匹配的部分一个字符,到 em
, 然后再试一次。这次匹配会成功,因为会有一个 >
。留在 >
的字符串中在正则表达式中进行匹配。
编辑:惰性量词的工作方式与贪婪量词相反。惰性量词不是从尝试匹配整个字符串的其余部分并逐个字符退出,而是从尝试匹配单个字符开始,在本例中只是 e
。 .如果这不允许完整的正则表达式匹配(它不会在这里,因为你在正则表达式中有 >
试图匹配字符串中的 m
),惰性量词将向上移动以匹配两个字符,em
.然后 >
在正则表达式中将与 >
对齐在字符串中,匹配就会成功。但是,如果它没有成功,惰性量词将移动到三个字符,依此类推。
关于java - 针对懒惰或贪婪的正则表达式所有格量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3253134/
我试图让用户提交查询“Joe Frankles”、“Joe Frankle”、“Joe Frankle's”以匹配原始文本“Joe Frankle's”。现在我们正在索引这个文本所在的字段(轮胎/ r
我是一名优秀的程序员,十分优秀!