在bash中将字符串与正则表达式匹配

时间:2017-03-30 21:41:50

标签: bash shell

在下面的代码中,要么设置T1要么T2必须跟在正则表达式之后,否则打印“错误”,但它不起作用。

有没有更好的方法来检查T2是否有模式<a string with underscore >:<space separated strings>;请注意冒号和分号。

#!/bin/bash

T1="TEST"
T2="TST_1:one two three;"

if [[ -z ${T1} && ! ${T2} =~ .*":".*";" ]]; then
    echo "error"
    exit 1
fi

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

re='^[^:_]+_[^:_]:[^[:blank:];]+([[:blank:]]+[^[:blank:];]+)+;$'

T1="TEST"
T2="TST_1:one two three;"

if [[ -z "$T1" && ! $T2 =~ $re ]]; then
    echo "error"
    exit 1
fi

RegEx Demo

答案 1 :(得分:0)

这对我有用:

  re="^.+_.+:.+( .+)+;$"
  if [[ -z "$T1" && ! $T2 =~ $re ]]; then
     echo "Error"
     exit 1
  fi

对于该正则表达式,插入符号(“^”)表示该行的开头。然后是“。+”,它是任何字符(句点)的1次或更多次(加号)。然后有一个下划线和另一组1个或多个字符后跟冒号。之后,您有一组1个或多个字符,后跟至少一组空格和一些字符。然后分号和一个美元符号意味着必须是行的结尾。

使用您的样本,它会按如下方式分解:

^.+    - "TST" at the beginning of the line
_      - the underscore
.+     - "1"
:      - the colon
.+     - "one"
( .+)+ - inside the parentheses, there's a space and a .+ 
         meaning one or more characters.  So that's " two". 
         But the plus after the right parenthesis means one 
         or more of that group so it also applies to " three" 
         as well as any other groups of letters that might
         follow, separated by spaces.
;$     - the trailing semicolon, at the very end of the line.

这将允许开头的任何字符集(只要有下划线),冒号和由空格分隔的任意数量的字符组。当然还有落后的分号。

顺便说一下,如果你想把东西限制在字母,数字和下划线上(这样“t#t_1:...”就会失败),请切换“\ w”的句号,这是[a-的简写ZA-Z0-9 _]。

如果你想要使用正则表达式,那么像https://www.debuggex.com/?flavor=pcre这样的调试器会很有用。

希望这有帮助!