我如何匹配确切的单词边界,但不包括正面和背面的特殊字符?

问题描述

我似乎不知道该怎么做。基本上,我只希望tcl中的正则表达式匹配我指定的单词边界,而没有任何特殊字符,例如前后的+-。()。

这是我尝试过的事情,但与之不符:

假设我有以下字符串:

hello world + hello world -hello world 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

解决方法

documented一样,Tcl使用\y来匹配单词边界,而不是\b(这是一个退格字符,用于与通用Tcl代码使用的转义符兼容)。这意味着您需要这样的RE:

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

中间部分是\yhello\y,它与单词匹配,然后我们需要在开头使用^|[^-+]来匹配字符串的开头或匹配-或{{ 1}},最后是+。 (我将它们放在$|[^-+]中只是为了限制(?:…) RE运算符的范围。)

在交互式会话中进行演示:

|
,

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

(?:^|[^-+.()\w])(hello)(?![-+.()\w])
  • (?:非捕获组
    • ^字符串的开头
    • |
    • [^-+.()\w]否定的字符类别[^,与列出的所有字符都不匹配
  • )关闭非捕获组
  • (hello)捕获第1组,打个招呼
  • (?!负向查找,断言直接在右边的不是
    • [-+.()\w]匹配列出的任何一个
  • )关闭lokahead

Regex demo

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...