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

编写正则表达式时需要的帮助--TCL,tcl,Tcl,只是想帮个忙,写一个正则表达式来匹配下面的字符串集。我想写一个表达式,它匹配以下所有字符串TCL i) (xyzxzzxvz XWZ) 提示:开始字符串是X,结束字符串是所有对相同的Z。只有中间的字符串是Y Z V W 我的审判:[regexp{^X([Y|Z|V|W]*)Z$}] 我想编写另一个regexp,它只捕获/匹配以下字符串 ii)(XYZ) 我的试用版:[regexp{^X([Y]*)Z$}]或者干脆regexp{^XYZ$} 只是想确保它是一个正确的方法。是否有其他方法可以优化re

只是想帮个忙,写一个正则表达式来匹配下面的字符串集。我想写一个表达式,它匹配以下所有字符串TCL

i) (xyzxzzxvz XWZ)

提示:开始字符串是X,结束字符串是所有对相同的Z。只有中间的字符串是Y Z V W

我的审判:
[regexp{^X([Y|Z|V|W]*)Z$}]

我想编写另一个regexp,它只捕获/匹配以下字符串

ii)(XYZ)

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

只是想确保它是一个正确的方法。是否有其他方法可以优化regexp:)

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 当我包括parantasis[regexp-all-inline{X([YZVW])Z}$to_Match_Str]时。它正确地打印所有中间字符Y Z V W

我的审判:[regexp{^X([Y|Z|V|W]*)Z$}]

这将匹配给定的字符串,但当您使用
*
乘法器时,它还将匹配诸如“XZ”、“XYYYYYYYYYYYYYYYYZ”和“xyyyyvwwwzvyyywz”之类的字符串。要仅匹配中间字符一次,请不要使用乘数:

^X([Y|Z|V|W])Z$
我的审判:[regexp{^X([Y]*)Z$}]

同样,它还将匹配“XZ”、“XYYZ”和“XYYYYYYYYYYYYYZ”等字符串。不要在集合后放置乘数:

^X([Y])Z$
或者只是regexp{^XYZ$}

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

^X(Y)Z$
我的审判:[regexp{^X([Y|Z|V|W]*)Z$}]

这将匹配给定的字符串,但当您使用
*
乘法器时,它还将匹配诸如“XZ”、“XYYYYYYYYYYYYYYYYZ”和“xyyyyvwwwzvyyywz”之类的字符串。要仅匹配中间字符一次,请不要使用乘数:

^X([Y|Z|V|W])Z$
我的审判:[regexp{^X([Y]*)Z$}]

同样,它还将匹配“XZ”、“XYYZ”和“XYYYYYYYYYYYYYZ”等字符串。不要在集合后放置乘数:

^X([Y])Z$
或者只是regexp{^XYZ$}

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

^X(Y)Z$
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$}

只是想确保它是一个正确的方法。是否有其他方法可以优化regexp:)

这是进行精确比较的最佳选择。事实上,Tcl将在内部对其进行优化,使其成为一个直接的字符串相等测试(如果是文字测试)

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$}

只是想确保它是一个正确的方法。是否有其他方法可以优化regexp:)


这是进行精确比较的最佳选择。事实上,Tcl将在内部对其进行优化,使其成为一个直接的字符串相等性测试(如果是文字测试)。

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

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

,没有比Tcl核心团队成员的回答更权威的了。干杯。:)这个问题唯一棘手的一点是准确地计算出所问的问题。(正常情况下,那些善于提问的人通常一开始就不需要提问。所以我更愿意尝试帮助人们。)