TCL正则表达式的例子

时间:2011-07-01 05:12:08

标签: regex string tcl string-matching

我希望通过编写正则表达式来获取以abc_或xyz_开头的字符串中的单词。 我的脚本在这里:

[regexp -nocase -- {.*\s+(abc_|xyz_\S+)\s+.*} $str all necessaryStr]

因此,如果我在str1和str2上应用上面写的正则表达式,我想从$ str1获得“xyz_hello”,从$ str2获得“abc_bye”。

set str1 "gfrdgasjklh dlasd =-0-489 xyz_hello sddf 89rn sf n9"
set str2 "dytfasjklh abc_bye dlasd =-0tyj-489 sddf tyj89rn sjf n9"

但是我的正则表达不起作用。我的问题是:

1)我的正则表达式出了什么问题? 2)使用regexp从一些预定义的前缀开始查找作品是否合适,或者最好使用字符串函数(字符串匹配等)?

3 个答案:

答案 0 :(得分:2)

在你的问题中,不清楚是什么构成了一个词。是否允许进一步下划线?是否允许数字?那么“只包含前缀的单词”,例如“abc_”或“xyz”?

做出保守的假设(基于你的例子),你只期望英文字母中的字母,至少还有一个字符,而你不关心案例,你可以简化你的正则表达式:

[regexp -nocase -- {\m(abc_|xyz_)[a-zA-Z]+} $str match]

这会将match设置为匹配的字词。如果您对单词的定义与我的假设不同,您可以替换方括号的加号。

关于是否更喜欢regexp到字符串函数的第二个问题将取决于上下文,并可能导致主观领域。

需要考虑的一些事项:

  • 表现真的重要吗?除非您在紧密循环中进行搜索,或者搜索非常长的字符串,否则我怀疑任何性能差异都不相关。等到遇到性能问题,然后对应用程序进行概要分析,看看瓶颈在哪里,然后就可以测试其他实现了。
  • 便利性将取决于必须编写和维护代码的程序员的偏好。他们喜欢/讨厌使用正则表达式吗?
  • 使用正则表达式可能会提供更大的灵活性,但这可能会牺牲可读性。

我的建议是使用你最舒服的。为您的代码编写一组良好的单元测试,然后只有在分析过程中发现了瓶颈时才进行优化。

答案 1 :(得分:2)

根据你所写的内容,你似乎是以abc_xyz_(无论如何)开头并且之后只有字母的单词。匹配这个的第一次尝试是:

regexp -nocase -- {\y(?:abc_|xyz_)[a-z]+} $str match

这方面的特点是:

  • \y表示这只匹配单词start(理论上也是单词end,但我们在所有情况下都用一个字母跟着它!)
  • (?:…)正在分组而未捕获
  • 贪婪匹配意味着我们将获得所有单词(假设它只是意味着来自UNICODE的ASCII范围的字母)。考虑使用\w\S代替[a-z],但这些确实会改变匹配内容的语义(\w将为您提供程序标识符中通常允许的符号,以及\S会给你非空格。

答案 2 :(得分:0)

我修好了它:      [regexp -nocase - {。* \ s +((abc_ | xyz _)\ S +)\ s +。*} $ str all necessaryStr]

但是仍然想知道正则表达式是最好的解决方案还是字符串函数更好(更快,更方便,更灵活)。