Regex 将正则表达式简化为更简单的术语

Regex 将正则表达式简化为更简单的术语,regex,sh,Regex,Sh,我在脚本中有一些测试括号,这对我来说很好,但我怀疑有一种更简单的方法可以做到这一点。对于下面的表达式,是否有一种方法可以使用单个正则表达式而不是使用两个单独的检查 基本上,如果第二个数字是1,我想第三个数字匹配0-9,但是如果第二个数字是2,我只想匹配0或1。我有一种感觉,有一种比使用两个单独的比较更简单的方法来实现这一点,我只是好奇是否有人知道更好的方法 #! /bin/sh [[ "${Var}" =~ 1.1.[0-9].* ]] || [[ "${Var}" =~ 1.2.[0-1].*

我在脚本中有一些测试括号,这对我来说很好,但我怀疑有一种更简单的方法可以做到这一点。对于下面的表达式,是否有一种方法可以使用单个正则表达式而不是使用两个单独的检查

基本上,如果第二个数字是1,我想第三个数字匹配0-9,但是如果第二个数字是2,我只想匹配0或1。我有一种感觉,有一种比使用两个单独的比较更简单的方法来实现这一点,我只是好奇是否有人知道更好的方法

#! /bin/sh
[[ "${Var}" =~ 1.1.[0-9].* ]] || [[ "${Var}" =~ 1.2.[0-1].* ]] && echo true || echo false
多亏了sln,最终的结果是

=~7.(1.(10 |[0-9])| 2.[0-1])-.*

实现这一点的shell不可知论(posixly-portable)方法是

case $var in
  (1.1.[0-9].*|1.2.[01].*)  echo true;;
  (*)                       echo false;;
esac
请注意,这是多么容易以可读的方式扩展到更多模式。您还可以使用

case $var in
  (1.1.[0-9].*)  echo true;;
  (1.2.[01].*)   echo true;;
  (*)            echo false;;
esac

顺便说一句:
sh
通常不是
bash
。试试
1\.(1\[0-9]|2\[01])
Cyrus,更正我把这个标记错了。我的道歉。@sln谢谢,我现在明白了。当我试图使用OR时,缺少了括号。@sln,再次感谢。我还需要解释10,所以我的最终表达式是:=~1\.(1\.(10 |[0-9])2\[0-1])-.*]]Jens,谢谢这是一个有趣的例子,是的,它的可读性很好。