相关疑难解决方法(0)

为什么一些正则表达式引擎在单个输入字符串中匹配.*两次?

许多正则表达式引擎在单行字符串中匹配.* 两次,例如,在执行基于正则表达式的字符串替换时:

  • 根据定义,第一个匹配是整个(单行)字符串,如预期的那样.
  • 在许多引擎中有第二个匹配,即空字符串 ; 也就是说,即使第一个匹配消耗了整个输入字符串,.*也会再次匹配,然后匹配输入字符串末尾的空字符串.

    • 注意:要确保只找到一个匹配项,请使用^.*

我的问题是:

  • 这种行为有充分的理由吗?一旦输入字符串被完全消耗,我就不会期望再次尝试找到匹配项.

  • 除了试验和错误,你能从文档/正则表达式方言/标准中收集哪些引擎表现出这种行为?

更新:雷沃乐于助人的回答解释了如何与当前的行为的; 至于潜在的原因,请参阅此相关问题.

表现出行为的语言/平台:

 # .NET, via PowerShell (behavior also applies to the -replace operator)
 PS> [regex]::Replace('a', '.*', '[$&]'
 [a][]  # !! Note the *2* matches, first the whole string, then the empty string

 # Node.js
 $ node -pe "'a'.replace(/.*/g, '[$&]')"
 [a][]

 # Ruby
 $ ruby -e "puts 'a'.gsub(/.*/, '[\\0]')"
 [a][]

 # …
Run Code Online (Sandbox Code Playgroud)

.net ruby python regex node.js

6
推荐指数
1
解决办法
231
查看次数

标签 统计

.net ×1

node.js ×1

python ×1

regex ×1

ruby ×1