将正则表达式放入变量中

时间:2017-08-25 14:11:42

标签: regex bash grep

REG=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g
(echo "1.2.3" | grep -Eq "$REG" ) && echo "matched" || echo "did not match"

我收到错误:

test.sh: line 2: syntax error near unexpected token `('
test.sh: line 2: `REG=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g'

在这里不是很多。试图查看1.2.3是否符合正则表达式。

我从这里得到的表达:https://github.com/mojombo/semver/issues/232

2 个答案:

答案 0 :(得分:2)

使用引号使shell不会对特殊字符进行barf。

REG='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g'

请注意,此正则表达式不适用于grep。 POSIX正则表达式语法与Perl语法不同且更有限,这是您所拥有的。

答案 1 :(得分:0)

你遇到了两个主要问题

  1. Bash在存储之前处理特殊字符,转义以及在字符串中找到的任何其他内容。这可以通过单引号来解决,以防止bash扩展/解释。

  2. Regex是用Perl语法编写的,grep不支持,它使用的POSIX与Perl略有不同,即使两者相似。这可以通过移除周围的/ /g并将\d的所有[0-9]实例替换为POSIX无法识别的REG='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$' 来解决。

  3. 结果:

    KeyValuePair<TKey,TValue>