Regexp TCL无法获取包含字符的整个单词

问题描述

我是 TCL 的新手,我需要在 TLC 中使用正则表达式来提取所有包含 5 的数字

我拼凑了一个成功的但我不能使用它,因为它lsearch :

set x "55 6 90 5 89 105 7 85 191"  
puts [lsearch -all -inline -regexp $x {5} ]

这导致:

55 5 105 85

这是我想要使用正则表达式的地方

这是我能得到的最接近的:

puts [regexp -all -inline {9.+} $x]

我得到了结果:

{90 5 89 105 7 85 191 }

显示不属于那里的额外单词

解决方法

正则表达式 9.+ 将匹配字符串中的前 9 个字符和后面的一个或多个字符的最长可能序列,直到字符串结束。 (但是,如果前 9 个是字符串中的最后一个字符,则它不会匹配,因为要求至少有一个后续字符)。如果您只想将字符串中的单个 单词 与其中的 9 匹配,您可以使用 0 个或多个非空白字符的序列来括起文字 9(或 5,或其他):

% regexp -all -inline {\S*9\S*} $x
90 89 191
% regexp -all -inline {\S*5\S*} $x
55 5 105 85
,

如果您只想匹配包含 9 的数字,您可以匹配数字周围的可选数字并使用字边界来防止部分匹配。 . 将匹配任何字符并且会匹配太多。

\m\d*9\d*\M
  • \m 词首的词边界
  • \d*9\d* 在可选数字之间匹配 9
  • \M 词尾的词边界

例如

set x "55 6 90 5 89 105 7 85 191"
regexp -all -inline {\m\d*9\d*\M} $x

输出

90 89 191