【发布时间】:2017-12-14 10:59:24
【问题描述】:
我正在尝试提出一个正则表达式,我可以使用它来匹配由单引号或双引号括起来的字符串。正则表达式应匹配以下所有字符串:
"ABC&VAR#"
'XYZ'
"ABC.123"
'XYZ&VAR#123'
这是我目前所拥有的:
^([\x22\x27]?)[\w.&#]+\1$
\x22代表"字符,\x27是'字符。
这适用于RegExr,但不适用于使用 =~ 运算符的 Bash 比较。我忽略了什么?
更新:问题是我的正则表达式使用Bash 不支持的PCRE 语法的两个功能:\w 原子和反向引用。感谢Inian 提醒我这一点。我决定使用 grep -oP 而不是 Bash 内置的 =~ 运算符,这样我就可以利用 PCRE 的优势。请参阅下面的评论。
【问题讨论】:
-
\w是一个 perl 正则表达式原子,bash使用 POSIX 扩展正则表达式代替 -
查看了各种替代方案,我决定采用这样的方法:
if [[ $(echo "${string}" | grep -oP $regex >/dev/null; echo $?) -eq 0 ]]; then...这样我就可以使用 PCRE 细节,例如\w和反向引用。