regex 如何精确匹配单词边界,但排除前后特殊字符?

li9yvcax  于 2022-12-01  发布在  其他
关注(0)|答案(3)|浏览(150)

基本上,我只想让tcl中的正则表达式匹配我指定的单词边界,而不需要任何特殊字符,比如+-.()在前面或后面。
以下是我尝试的东西,它只是不匹配:
下面是一个例子:
你好世界+你好世界-你好世界Hello+ Hello
我希望它只匹配hello,而不是hello+或-hello

\bhello\b
 - hello
 - +hello
 - -hello
 - hello+

[^+-]\bhello\b[^+-]
 - no matches

[^+-]\bhello\b
 - (doesn't match the first hello even though it should've matched)
 - hello+
 - hello

(?![+-])\bhello\b(?![+-])
 - hello
 - +hello
 - -hello
ppcbkaq5

ppcbkaq51#

作为documented,Tcl使用\y来匹配单词边界,而不是\b\b是一个退格字符,与一般Tcl代码使用的转义字符兼容)。

(?:^|[^-+])\yhello\y(?:$|[^-+])

中间的部分是\yhello\y,它匹配单词,然后我们需要在开头使用^|[^-+]来匹配字符串的开头或者除了-+之外的字符,并等效地使用$|[^-+]来匹配结尾。(我将它们放在(?:…)中只是为了限制| RE运算符的作用域。)
通过互动会话进行演示:

% set RE {(?:^|[^-+])\yhello\y(?:$|[^-+])}
(?:^|[^-+])\yhello\y(?:$|[^-+])
% regexp $RE "hello"
1
% regexp $RE "ahello"
0
% regexp $RE "+hello"
0
% regexp $RE "+ hello"
1
% regexp $RE "hello+"
0
% regexp $RE "hello-"
0
% regexp $RE "hello.-"
1
ekqde3dh

ekqde3dh2#

这个正则表达式匹配单词hello,允许前后有空格,但不允许其他任何字符。创建单词字符和特殊字符的边界。

(?<!\S)hello(?!\S)

这使用了“负向前看”和“负向后看”语法。
(?<!\S):查看后面并确保没有任何非空白字符。
(?!\S):向前看并确保没有任何非空白字符。

o2g1uqev

o2g1uqev3#

另一个不使用单词边界的选项是排除将否定字符类中的单词char与其他不应匹配的字符一起匹配:

(?:^|[^-+.()\w])(hello)(?![-+.()\w])
  • (?:非捕获组
  • ^字符串开头
  • |
  • [^-+.()\w]取反的字符类[^,匹配除列出的字符之外的任何字符
  • )关闭非捕获组
  • (hello)捕获组1,匹配hello
  • (?!负lookahead,Assert直接向右的不是
  • [-+.()\w]与列出的任何项匹配
  • )关闭锁定

Regex demo

相关问题