如果不在字符串的开头,expr不返回模式

时间:2016-07-07 12:15:33

标签: bash

使用此版本的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

我想我必须误解一些明显的东西,但我找不到什么。

感谢您的帮助:)

1 个答案:

答案 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(^作为第一个字符) "