正则表达式不符合我的预期

时间:2014-06-04 17:04:53

标签: regex perl bash unix

我有以下字符串:connect_2014-06-03.csv和以下正则表达式:(\S+)[_-]

我想要做的只是从字符串中提取第一个单词,即connect,但由于某种原因,正则表达式匹配connect_2014-06-。我试图通过(\S+)[_-]?使其变得非贪婪,但这似乎不起作用。

有人有任何想法吗?

3 个答案:

答案 0 :(得分:4)

+贪婪,而不是整体正则表达式。您需要修改捕获组内的\S+以免贪婪。

(\S+?)[_-]

另见regex101

也许有意义的是不使用任何非空格字符,而只是使用([a-z]+)_?请记住,破折号和下划线也是非空格。

答案 1 :(得分:1)

您可以使用BASH字符串操作代替正则表达式:

s='connect_2014-06-03.csv'
echo "${s%%_*}"
connect

使用正则表达式时,您可以使用:

[[ "$s" =~ ^([^_]+) ]] && echo "${BASH_REMATCH[1]}"
connect

答案 2 :(得分:1)

这有两个简单的解决方案。

您可以通过向量词库添加?来明确声明您需要非贪婪。

(\S+?)[_-]

或者你可以让你的角色类限制自己:

([^_-\s]*)