Perl-regex词边界等价

kob*_*ame 0 regex perl

扩展我的基本正则表达式知识,有些事情对我来说不清楚.

如果\b匹配词边界具有相同的意思的下两个正则表达式 - 例如将匹配相同的字符串?

/\bword\b/
/(^|\W)word(\W|$)/m    #when multi-line is turned on
/(\A|\W)word(\W|\z)/
Run Code Online (Sandbox Code Playgroud)

问,因为\b手段词边界.这个词是\w+,所以\b必须是什么不是\w,例如它必须是\W或字符串或行的开头或结尾.(或没有?)(不计算捕获组,可能会更好地使用一些非捕获外观 - 某处).

那两个?

/word\B/
/word\w/
Run Code Online (Sandbox Code Playgroud)

如果单词最后必须是"非字边界",则表示该单词必须后跟\w(单词)字符.(或没有?)

ike*_*ami 5

(忽略以下模式中的空格.我假设/x用于可读性.)


\b
Run Code Online (Sandbox Code Playgroud)

相当于

(?<!\w)(?=\w) | (?<=\w)(?!\w)
Run Code Online (Sandbox Code Playgroud)

所以

\b word \b
Run Code Online (Sandbox Code Playgroud)

相当于

(?: (?<!\w)(?=\w) | (?<=\w)(?!\w) ) word (?: (?<!\w)(?=\w) | (?<=\w)(?!\w) )
Run Code Online (Sandbox Code Playgroud)

这简化为

(?<!\w) word (?!\w)
Run Code Online (Sandbox Code Playgroud)

您建议的等价物略有不同.


\B
Run Code Online (Sandbox Code Playgroud)

相当于

(?<=\w)(?=\w) | (?<!\w)(?!\w)
Run Code Online (Sandbox Code Playgroud)

所以

word \B
Run Code Online (Sandbox Code Playgroud)

相当于

word (?: (?<=\w)(?=\w) | (?<!\w)(?!\w) )
Run Code Online (Sandbox Code Playgroud)

这简化为

word (?=\w)
Run Code Online (Sandbox Code Playgroud)

您建议的等效(word\w)略有不同.

  • `(?= ...)`表示后跟.`(?!...)`表示没有跟着.`(?<= ...)`表示先于.`(?<!...)`表示不在前面.`=`和`!`很容易记住,而`<`表示之前而不是之后. (3认同)