Pra*_*lan 3 regex string non-greedy regex-negation
我需要匹配@anything_here@一个字符串@anything_here@dhhhd@shdjhjs@.所以我使用了以下正则表达式.
^@.*?@
Run Code Online (Sandbox Code Playgroud)
要么
^@[^@]*@
Run Code Online (Sandbox Code Playgroud)
这两种方式都有效,但我想知道哪一个是更好的解决方案.具有非贪婪重复的正则表达式或带有否定字符类的正则表达式?
如果可能,通常应优先选择否定字符类而不是惰性匹配。
如果正则表达式成功,^@[^@]*@可以@一步匹配s之间的内容,同时^@.*?@需要对@s之间的每个字符进行扩展。
当失败时(对于没有结尾的情况@)大多数正则表达式引擎会应用一些魔法并在内部将其[^@]*视为[^@]*+,因为@和 非之间有一个清晰的边界@,因此它将匹配到字符串的末尾,识别丢失的@和不是回溯,而是立即失败。.*?将像往常一样逐个扩展字符。
当在更大的上下文中使用时,[^@]*也永远不会扩展到结尾的边界,@而这对于惰性匹配来说是非常可能的。例如^@[^@]*a[^@]*@不会匹配@bbbb@a@而^@.*?a.*?@会。
请注意,[^@]这也将匹配换行符,而.不会(在大多数正则表达式引擎中,除非在单行模式下使用)。您可以通过向否定添加换行符来避免这种情况 - 如果不需要的话。
很明显,^@[^@]*@选择要好得多.
否定的字符类被贪婪地量化,这意味着正则表达式引擎@尽可能多地立即抓取0或更多字符.看到这个正则表达式演示和匹配:
当您使用延迟点匹配模式时,引擎匹配@,然后尝试匹配尾随@(跳过.*?).它没有找到@索引1,所以.*?匹配achar.这种.*?模式扩展的次数与除@第一种之外的字符数一样多@.
请参阅此处基于延迟点匹配的模式演示,这里是匹配的步骤:
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |