我一直在研究正则表达式几天,特别是看了一下。我无法理解这个与“bar”组成的句子不匹配的正则表达式。
^(?!.*bar).*$
我无法理解为什么使用.*bar
。如果有人能给我一个很好的解释,这对我很有帮助。谢谢....
答案 0 :(得分:2)
如果内部的匹配内容匹配,那么否定前瞻就会导致整个比赛失败。
因此,如果在指定的位置(在您的示例中,^
在行的开头指定)前瞻中的模式匹配,则整个匹配失败。
让我们看看,你有.*bar
。如果.*bar
匹配,则整个正则表达式失败。
.*bar
什么时候匹配?答案是,只要行中有bar
,它就会匹配:
bar
foo bar
foo bar baz
假设没有.*
。因此,您将看到负面前瞻中的bar
。如果bar
仅匹配,则整个匹配失败。现在,请记住这个检查是在开始。
bar
foo bar
foo bar baz
第一行是唯一一个在开头匹配bar
的行。因此,^(?!bar).*$
只会阻止一行开头的匹配,但如果有^(?!.*bar).*$
,则bar
会阻止该行匹配。
希望这会让它更清晰一些:)
答案 1 :(得分:0)
编辑:修复了示例
(?!.*bar)
是否为前瞻性意味着它会检查以确保。*栏不在该行中。
以下是如何使用否定前瞻(See it in action)的示例:
(?!GBP).*\d{3}.*
这确保匹配三位数字,只有当它们前面没有术语“' GBP'
答案 2 :(得分:0)
<强>正则表达式强>
^(?!.*bar).*$
<强> Source 强>
NODE EXPLANATION -------------------------------------------------------------------------------- ^ the beginning of the string -------------------------------------------------------------------------------- (?! look ahead to see if there is not: -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- bar 'bar' -------------------------------------------------------------------------------- ) end of look-ahead -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- $ before an optional \n, and the end of the string