2011-07-01 41 views
1

我想通过写一个正则表达式来获取以abc_开头的字符串或用xyz_开头的字。 这里我的脚本:TCL正则表达式示例

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

所以,如果我申请上str1和str2的上述正则表达式写我想从$ str2的$ str1和“abc_bye”得到“xyz_hello”。

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查找以某些预定义前缀开始的作品是好事,还是使用字符串函数(字符串匹配等)更好?

回答

2

在你的问题中不清楚是什么造成了一个词。是否允许进一步强调?数字是否允许?关于“仅由前缀组成的词”的例子,例如“abc_”或“xyz”?

使得保守的假设(根据你的例子),你期望从英文字母,至少一个另外的字符只有字母,你不关心的情况下,可以简化您的正则表达式:

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

这将设置match到匹配的单词。如果你的单词的定义与我的假设不同,你可以替换方括号的内容。

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

有些事情要考虑:

  • 性能是否真的重要?除非你在紧密的循环中搜索,或者搜索非常长的字符串,否则我认为任何性能差异都是无关紧要的。等到出现性能问题时,再对应用程序进行配置以查看瓶颈位置,然后您可以测试其他实现。
  • 便利性将取决于必须编写和维护代码的程序员的偏好。他们爱/使用正则表达式讨厌吗?
  • 使用正则表达式可能会提供更多的灵活性,但它可能是以可读性为代价的。

我的建议是使用你最喜欢的任何一个。为您的代码编写一套完整的单元测试,然后仅在分析过程中发现瓶颈时再进行优化。

+0

你要锣想添加'\ m'或'\ y'到你的模式开始,以确保你匹配开始一个字 - 正如所写的,它会匹配“zzzabc_zzz” –

+0

是的,从最初的问题来看,“zzzabc_zzz”是否应该匹配或者“0abc_x”,“_abc_x_”等等。由于现在已经从其他评论中清楚了,我会更新我的答案。干杯。 – Ergwun

0

我有固定的: [正则表达式-nocase - | $海峡所有necessaryStr {* \ S +((abc_ XYZ _)\ S +)\ S + *。}]

但还是想知道如果regexp是最好的解决方案或字符串函数更好(更快,方便,灵活)。

+0

这不适用于您在问题中提供的示例。 (除非你删除星号。)你的问题并不清楚你想要匹配什么。从这个答案看来,您希望匹配前缀“abc_”或“xyz-_”后面的任何非空白字符。看到我的答案更简单的正则表达式。 – Ergwun

+0

我想从$ str1获得“xyz_hello”,从$ str2获得“abc_bye”。它工作正常。 (请注意,我标记的“xyz_hello”和“abc_bye”为粗体,但是这个网站,而不是让他们粗体的在我想要匹配的单词前后添加了“**”符号。对不起。 – Narek

+0

啊,格式化问题,我明白了,从最初的问题来看,你仍然不清楚你想在更一般的情况下匹配什么,我们只能根据你自己的解决方案猜出猜测,那么这些字符串是什么意思呢:“abc_”,“xabc_” “abc_x”,“xabc_”,“xabc_x”,“abc_x”?它们都不会与你的正则表达式匹配,因为它会在该单词前后加上空格,那么“abc_.2 /&*”会怎么样呢?这一切都是故意的? – Ergwun

2

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

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

这样做的特殊特点是:

  • \y意味着,在字的开始这只是比赛(理论上一句话结束了,但是我们通过遵循它信在所有情况下!)
  • (?:…)被分组而不捕获
  • 贪婪的匹配意味着我们将得到所有的字(假设它只是意味着从UNICODE的ASCII范围)的信件。考虑使用\w\S而不是[a-z],但这些确实会改变匹配内容的语义(\w会给出关于程序标识符中通常允许使用哪些符号的内容,而\S会给予您非空格)。