编写正则表达式时需要帮助 - TCL

时间:2010-05-02 09:01:39

标签: tcl

只是寻求帮助来编写正则表达式以匹配以下字符串集。我想写一个匹配以下所有字符串TCL

的表达式

i)(XYZ XZZ XVZ XWZ)

线索:起始字符串为X,Z结束字符串对所有对都相同。只有中间字符串是不同的Y Z V W.

我的试用版:[regexp {^X([Y|Z|V|W]*)Z$}]

我想编写另一个正则表达式,无论何时何地捕获/匹配以下字符串

ii)(XYZ)

我的试用版:[regexp {^X([Y]*)Z$}]或简称regexp {^XYZ$}

只是想确保它是正确的方法。有没有其他方法可用于优化正则表达式:)

i)第一个问题经过测试

set to_Match_Str "XYZ XZZ XVZ XWZ"
    foreach {wholeStr to_Match_Str} [regexp -all -inline  {X[YZVW]Z} $to_Match_Str] { 

    puts "MATCH $to_Match_Str in the list" 
    } 

它仅从列表中打印XZZ XWZ。它留下了XYZ& XVZ 当我包括paranthesis [regexp -all -inline {X([YZVW])Z} $ to_Match_Str]时。它正确打印所有中间字符Y Z V W

3 个答案:

答案 0 :(得分:3)

  

i)(XYZ XZZ XVZ XWZ

     

线索:起始字符串为XZ结束字符串对所有对都相同。只有中间字符串不同Y Z V W

     

我的试用版:[regexp {^X([Y|Z|V|W]*)Z$}]

假设你不是在整个地方的字面括号之后,你使用这个匹配:

regexp {X([YZVW])Z} $string -> matchedSubstr

那是因为内部字符串都是单个字符。 (它还将匹配的子字符串存储在变量matchedSubstr中;在那里选择您想要的任何变量名称。)您不应在正则表达式中的|内使用[],因为它具有那里没有特别的意义。 (您可能需要在外部添加^$个锚点。)

另一方面,如果你想匹配多个字符序列(Y等只是替身),那么你使用它:

regexp {X(Y|Z|V|W)Z} $string -> matchedSubstr

请注意,此处使用了| ,但[] 不是

如果您的真实字符串包含许多这些字符串(无论您使用哪种模式匹配它们),那么提取它们的最简单方法是使用-all -inline regexp选项,通常用于这样foreach

foreach {wholeStr matchedSubstr} [regexp -all -inline {X([YZVW])Z} $string] {
    puts "Hey! I found a $matchSubstr in there!"
}

混合搭配。

  

我的试用版:[regexp {^X([Y]*)Z$}]或只是regexp {^XYZ$}

     

只是想确保它是正确的方法。有没有其他方法可用于优化正则表达式:)

这对于精确比较来说是最佳选择。事实上,如果这是文字的话,Tcl会在内部优化到直线字符串相等测试。

答案 1 :(得分:0)

  

我的试用:[re​​gexp {^ X([Y | Z | V | W] *)Z $}]

这将匹配给定的字符串,但是当您使用*乘数时,它也会匹配“XZ”,“XYYYYYYYYYYYYYYYYZ”和“XYZYVWZWWWZVYYWZ”之类的字符串。要仅匹配中间字符一次,请不要使用乘数:

^X([Y|Z|V|W])Z$
  

我的试用:[re​​gexp {^ X([Y] *)Z $}]

同样,它也会匹配“XZ”,“XYYZ”和“XYYYYYYYYYYYYYYYYZ”之类的字符串。不要在集合之后放置乘数:

^X([Y])Z$
  

或只是regexp {^ XYZ $}

那不会抓到任何东西。要使它与另一个相同(捕获Y字符),您需要括号:

^X(Y)Z$

答案 2 :(得分:0)

您可以使用Visual Regexp工具提供帮助,它会在您构建正则表达式时提供反馈。