我希望通过编写正则表达式来获取以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从一些预定义的前缀开始查找作品是否合适,或者最好使用字符串函数(字符串匹配等)?
答案 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,但我们在所有情况下都用一个字母跟着它!)(?:…)
正在分组而未捕获\w
或\S
代替[a-z]
,但这些确实会改变匹配内容的语义(\w
将为您提供程序标识符中通常允许的符号,以及\S
会给你非空格。答案 2 :(得分:0)
我修好了它: [regexp -nocase - {。* \ s +((abc_ | xyz _)\ S +)\ s +。*} $ str all necessaryStr]
但是仍然想知道正则表达式是最好的解决方案还是字符串函数更好(更快,更方便,更灵活)。