一次检查两个变量模式

一次检查两个变量模式

是否可以检查两个变量是否同时匹配正则表达式模式而不是一一匹配?现在它的工作原理如下:

# A=1.1
# B=1.2
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
A:1.1 B1.2
# B=1.2.3
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
A:1.1 B1.2.3
# B=1.2.3.4
# [[ $A =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ && $B =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
#

我想同时测试两者,就像在这个不起作用的测试中一样:

# [[ ($A|$B) =~ ^([0-9]+(\.([0-9]+(\.([0-9]+))?))?)$ ]] && echo A:$A B$B
-bash: unexpected token `|', conditional binary operator expected
-bash: expected `)'
-bash: syntax error near `|$'
#

答案1

不幸的是你不能那样做(就像那样)。=~运算符 in的左侧bash是一个字符串(并且也应该正确引用)。如果您愿意,您显然可以制作一个正则表达式来同时匹配两个字符串(两个字符串的串联或其他内容),但这将使代码更难以阅读和维护,并且您可能不会获得任何结果速度从它(如果这就是你所追求的)。

另外,当您使用&&中间测试两个事物时,请考虑使用[[ ... ]] && [[ ... ]]而不是[[ ... && ... ]], 来明确并清楚第一个测试的右侧包含哪些内容以及第二个测试的左侧包含哪些内容。

答案2

如果您知道某个字符不能出现在成功的匹配中,您可以根据适当的重复正则表达式检查$A和的串联。$B

regex='([0-9]+(\.([0-9]+(\.([0-9]+))?))?)'

[[ "$A-$B" =~ ^$regex-$regex$ ]] && echo "A: $A B: $B"

您可能需要稍微调整正则表达式以补偿它不再包含^and$本身。

相关内容