基本上,我只想让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
3条答案
按热度按时间ppcbkaq51#
作为documented,Tcl使用
\y
来匹配单词边界,而不是\b
(\b
是一个退格字符,与一般Tcl代码使用的转义字符兼容)。中间的部分是
\yhello\y
,它匹配单词,然后我们需要在开头使用^|[^-+]
来匹配字符串的开头或者除了-
或+
之外的字符,并等效地使用$|[^-+]
来匹配结尾。(我将它们放在(?:…)
中只是为了限制|
RE运算符的作用域。)通过互动会话进行演示:
ekqde3dh2#
这个正则表达式匹配单词hello,允许前后有空格,但不允许其他任何字符。创建单词字符和特殊字符的边界。
这使用了“负向前看”和“负向后看”语法。
(?<!\S)
:查看后面并确保没有任何非空白字符。(?!\S)
:向前看并确保没有任何非空白字符。o2g1uqev3#
另一个不使用单词边界的选项是排除将否定字符类中的单词char与其他不应匹配的字符一起匹配:
(?:
非捕获组^
字符串开头|
或[^-+.()\w]
取反的字符类[^
,匹配除列出的字符之外的任何字符)
关闭非捕获组(hello)
捕获组1,匹配hello(?!
负lookahead,Assert直接向右的不是[-+.()\w]
与列出的任何项匹配)
关闭锁定Regex demo