使用此版本的bash:
GNU bash, version 4.1.2(1)-release (i386-redhat-linux-gnu)
如果我正在寻找的模式没有开始这个字符串,我如何让expr
在字符串中找到我的模式?
示例:
expr match "123 abc 456 def ghi789" '\([0-9]*\)' #returns 123 as expected
expr match "z 123 abc 456 def ghi789" '\([0-9]*\)' #returns nothing
在第二个例子中,我希望返回123。
进一步分析:
如果我通过在命令中添加.*
从字符串的结尾开始,我会得到一个奇怪的结果:
expr match "123 abc 456 def ghi789" '.*\([0-9]*\)' #returns nothing
expr match "123 abc 456 def ghi789" '.*\([0-9]\)' #returns 9 as expected
expr match "123 abc 456 def ghi789 z" '.*\([0-9]\)' #returns also 9
在这里,似乎可以在字符串的末尾找到模式(所以在我的搜索开始时),以及它是否不在字符串的末尾。但是如果我在正则表达式的末尾添加*
,它就不起作用。
另一方面,如果我从字符串的开头开始,则同样不适用:
expr match "z 123 abc 456 def ghi789" '\([0-9]\)' #returns nothing
我想我必须误解一些明显的东西,但我找不到什么。
感谢您的帮助:)
答案 0 :(得分:1)
将
expr match "123 abc 456 def ghi789 z" '[^0-9]*\([0-9]*\)
做到了吗? (刚刚在开头添加了[0-9]*
而不是.*
)
在评论中提到 - 表达式
expr match "123 abc 456 def ghi789 z" '^[^0-9]*\([0-9]*\)
更适合,因为部分^[^0-9]
可以读作"跳过所有不是数字的字符([^0-9]
)形式begin(^
作为第一个字符) "