惰性正则表达式运算符在 bash 中不起作用
Lazy regex operator doesn't work in bash
echo "$(expr "title: Purple Haze artist: Jimi Hendrix" : 'title:\s*\(.*\?\)\s*artist.*' )"
打印
Purple Haze
尽管我使用的是 ?
惰性运算符,但尾随空格。
我已经在 https://regex101.com/ 上测试过了,它按预期工作,bash 有什么不同?
您没有使用 bash 的正则表达式匹配,您使用的是 expr
。 expr
没有“?
惰性运算符”,它只实现了 basic regular expressions(在 Linux 版本中有一些扩展,例如 \s
用于白色space,但这不包括类似 Perl 的惰性运算符)。 (就此而言,bash 也没有。)
如果您不希望 .*
包含尾随 space,请指定它必须以非 space:
的字符结尾
'title:\s*\(.*\S\)\s*artist.*'
,您没有使用 bash 正则表达式。为此,您可以像这样使用正则表达式匹配运算符 =~
:
re='title:[[:space:]]*(.*[^[:space:]])[[:space:]]*artist.*'
details='title: Purple Haze artist: Jimi Hendrix'
[[ $details =~ $re ]] && echo "${BASH_REMATCH[1]}"
这不是使用惰性匹配,而是在捕获组末尾使用非 space 字符,因此尾随 space 被删除。第一个捕获组存储在 ${BASH_REMATCH[1]}
.
以跨平台可移植性为代价,也可以使用 shorthand \s
和 \S
代替 [[:space:]]
和 [^[:space:]]
:
re='title:\s*(.*\S)\s*artist.*'
echo "$(expr "title: Purple Haze artist: Jimi Hendrix" : 'title:\s*\(.*\?\)\s*artist.*' )"
打印
Purple Haze
尽管我使用的是 ?
惰性运算符,但尾随空格。
我已经在 https://regex101.com/ 上测试过了,它按预期工作,bash 有什么不同?
您没有使用 bash 的正则表达式匹配,您使用的是 expr
。 expr
没有“?
惰性运算符”,它只实现了 basic regular expressions(在 Linux 版本中有一些扩展,例如 \s
用于白色space,但这不包括类似 Perl 的惰性运算符)。 (就此而言,bash 也没有。)
如果您不希望 .*
包含尾随 space,请指定它必须以非 space:
'title:\s*\(.*\S\)\s*artist.*'
=~
:
re='title:[[:space:]]*(.*[^[:space:]])[[:space:]]*artist.*'
details='title: Purple Haze artist: Jimi Hendrix'
[[ $details =~ $re ]] && echo "${BASH_REMATCH[1]}"
这不是使用惰性匹配,而是在捕获组末尾使用非 space 字符,因此尾随 space 被删除。第一个捕获组存储在 ${BASH_REMATCH[1]}
.
以跨平台可移植性为代价,也可以使用 shorthand \s
和 \S
代替 [[:space:]]
和 [^[:space:]]
:
re='title:\s*(.*\S)\s*artist.*'