结合所有搜索模式-TCL regexp

时间:2012-12-05 18:02:18

标签: regex tcl

如何在一个regexp命令中组合所有模式?有办法吗?

示例:如果我的变量是“a”,并且我需要检查“a”是否有多于1个模式,如何在单个命令中执行此操作? 我试过像

这样的东西
    set a abc
    regexp ".abc | abc. | .abc." $a

这返回1作为输出。但它应该为零,因为我的所有模式都有“。”而且与$ a

不匹配

3 个答案:

答案 0 :(得分:2)

您失败了,因为空格字符表示正则表达式中的空格字符。所以你的正则表达式:

regexp ".abc | abc. | .abc." $a

正在寻找:

"anything" followed by "a" then "b" then "c" then " "
OR
" " followed by "a" then "b" then "c" then "anything" then " "
OR
" " followed by "anything" then "a" then "b" then "c" then "anything"

显然字符串“abc”与上述模式都不匹配,原因如下:

  1. 它不包含所有3个条件所需的任何空格字符(在正确的位置)。
  2. “a”之前没有字符匹配模式1& 2,“c”之后没有字符匹配模式2& 3
  3. 你可能想要的是这样的:

    regexp ".abc|abc.|.abc." $a
    

    但上面仍然与“abc”不匹配。它会匹配“abcd”,因为在“c”之后有一个额外的字符。要匹配“abc”,你需要:

    regexp ".abc|abc.|.abc.|abc" $a
    

    但我怀疑这是一个小问题。您的问题的核心是您没有意识到正则表达式也将空格解释为要搜索的内容。

答案 1 :(得分:0)

如果我对每个搜索模式使用括号

,它都有效
    regexp "(.abc)|(abc.)|(.abc.)" $a

答案 2 :(得分:0)

我可以推荐OpenBSD的re_format(7)手册页,以获得非常紧凑和正确的POSIX正则表达式参考。