只是寻求帮助来编写正则表达式以匹配以下字符串集。我想写一个匹配以下所有字符串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
答案 0 :(得分:3)
i)(
XYZ XZZ XVZ XWZ
)线索:起始字符串为
X
,Z
结束字符串对所有对都相同。只有中间字符串不同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)
我的试用:[regexp {^ X([Y | Z | V | W] *)Z $}]
这将匹配给定的字符串,但是当您使用*
乘数时,它也会匹配“XZ”,“XYYYYYYYYYYYYYYYYZ”和“XYZYVWZWWWZVYYWZ”之类的字符串。要仅匹配中间字符一次,请不要使用乘数:
^X([Y|Z|V|W])Z$
我的试用:[regexp {^ X([Y] *)Z $}]
同样,它也会匹配“XZ”,“XYYZ”和“XYYYYYYYYYYYYYYYYZ”之类的字符串。不要在集合之后放置乘数:
^X([Y])Z$
或只是regexp {^ XYZ $}
那不会抓到任何东西。要使它与另一个相同(捕获Y字符),您需要括号:
^X(Y)Z$
答案 2 :(得分:0)
您可以使用Visual Regexp工具提供帮助,它会在您构建正则表达式时提供反馈。