编写正则表达式时需要的帮助--TCL
只是想帮个忙,写一个正则表达式来匹配下面的字符串集。我想写一个表达式,它匹配以下所有字符串TCL i) (xyzxzzxvz XWZ) 提示:开始字符串是X,结束字符串是所有对相同的Z。只有中间的字符串是Y Z V W 我的审判:编写正则表达式时需要的帮助--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
[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核心团队成员的回答更权威的了。干杯。:)这个问题唯一棘手的一点是准确地计算出所问的问题。(正常情况下,那些善于提问的人通常一开始就不需要提问。所以我更愿意尝试帮助人们。)