常用的正则表达式有多种方言。Bash支持的是扩展正则表达式的变体。这与许多在线正则表达式测试人员支持的不同,后者通常是更现代的Perl 5 / PCRE变体。
- 不支持
\d
\D
\s
\S
\w
\W
-这些可以与POSIX字符类等同替换[[:digit:]]
,[^[:digit:]]
,[[:space:]]
,[^[:space:]]
,[_[:alnum:]]
,和[^_[:alnum:]]
,分别。(注意最后一种情况,其中[:alnum:]
POSIX字符类用下划线扩充,以完全等同于Perl\w
速记。) - Bash不支持非贪婪匹配。你有时可以
a.*?b
用类似的东西代替a[^ab]*b
在实践中获得类似的效果,尽管两者并不完全相同。 - Bash不支持非捕获括号
(?:...)
。在简单的情况下,只需使用捕获括号(...)
; 当然,如果您使用捕获组和/或反向引用,这将重新编号您的捕获组。 - Bash不支持类似的外观
(?<=before)
或(?!after)
实际上任何东西(?
都是Perl扩展。虽然您可以将问题重新划分为可以避免外观的问题,但这些问题并没有简单的一般解决方法
注
常见的替换:
\s ==> \ (空格转义) 或 [[:space:]]
\d ==> [0-9] 或 [[:digit:]]
有些bash环境下(没有细究),正则表达式中的"\s"是支持的(例如grep的参数),或者将正则表达式定义为变量使用时支持(例如if [[ $test =~ $regex ]] $regex变量支持"\s",直接在 =~ 的右边写正则表达式时不支持"\s")。