我有以下字符串:connect_2014-06-03.csv
和以下正则表达式:(\S+)[_-]
。
我想要做的只是从字符串中提取第一个单词,即connect
,但由于某种原因,正则表达式匹配connect_2014-06-
。我试图通过(\S+)[_-]?
使其变得非贪婪,但这似乎不起作用。
有人有任何想法吗?
答案 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]*)