我正在尝试使用bash样式正则表达式解析一个可选参数,每个字母都是一个选项。
option regex expected result
abc =~ *a* --> match, a is on
abc =~ *z* --> no match, z is off
Run Code Online (Sandbox Code Playgroud)
我无法确定为什么它无法正常工作,但是后来我发现这是Bash的行为:
$ [[ "f" =~ *c ]]; echo $?
2 # ok
$ [[ "f" =~ *c* ]]; echo $?
2 # ok
$ [[ "f" =~ c ]]; echo $?
1 # ok
$ [[ "f" =~ c* ]]; echo $?
0 # wtf ?
$ [[ "f" =~ f ]]; echo $?
0 # ok
$ [[ "f" =~ f* ]]; echo $?
0 # ok
$ [[ "f" =~ *f* ]]; echo $?
2 # why not ?
$ [[ "f" =~ *f ]]; echo $?
2 # same !
Run Code Online (Sandbox Code Playgroud)
我以为*可以匹配任何字符串,包括空字符串,但这严重使我怀疑我对正则表达式的理解...为什么会发生这种情况,以及如何解决呢?
作为记录,*与一起使用ls可得到预期的结果:
$ echo 1 > f
$ ls
f
$ ls f
f
$ ls *f
f
$ ls *f*
f
$ ls f*
f
$ ls c
ls: cannot access 'c': No such file or directory
$ ls c*
ls: cannot access 'c*': No such file or directory
$ ls *c
ls: cannot access '*c': No such file or directory
$ ls *c*
ls: cannot access '*c*': No such file or directory
Run Code Online (Sandbox Code Playgroud)
"f"匹配是完全正确的c*。空字符串匹配也应该是正确的c*。具体而言,此处匹配的是字符前面的空字符串f:
"f"
^
'----- c* correctly matches here
"f"
^
'---- it is not matching here
Run Code Online (Sandbox Code Playgroud)
正则表达式模式c*表示零个或多个字符“ c”。
显然,在查看字符“ f”之前,在字符串的开头,正则表达式引擎未找到字符“ c”。因此它匹配(找到的字符“ c”不匹配零个或多个字符“ c”)。
以下内容也应匹配:
$ [[ "" =~ *c ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
至于其他结果,您没想到:
$ [[ "f" =~ *c ]]; echo $?
2 # correctly returns "error"
$ [[ "f" =~ *c* ]]; echo $?
2 # correctly returns "error"
$ [[ "f" =~ *f* ]]; echo $?
2 # correctly returns "error"
$ [[ "f" =~ *f ]]; echo $?
2 # correctly returns "error"
Run Code Online (Sandbox Code Playgroud)
2bash中的返回状态表示一些错误。这是因为模式*本身是regexp中的语法错误:
*f
^
'------ syntax error, expecting something before zero-or-more qualifier (*)
Run Code Online (Sandbox Code Playgroud)
*regexp中的运算符要求您指定要查找的字符。单靠*它是没有意义的,因为您不能有零个或多个未定义的东西。
有关bash使用的正则表达式语法的更多信息,请参见正则表达式简介-TLDP。
在两行之间阅读时,您可能期望*成为通配符。有一种模式匹配语言可以做到这一点,称为glob。甲正则表达式是一个不同的模式匹配的语言。您可以使用运算符在bash中使用全局匹配==:
[[ "f" == *f* ]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |