expr 匹配中转义括号背后的意义

expr 匹配中转义括号背后的意义

任何人都可以告诉我以下两个命令在转义括号的情况下的区别,或者参考一些可以消除我疑问的文档。

string=abcABC123ABCabc

$ echo `expr match "$string" 'abc[A-Z]*.2'` #Result is 8, the count of matched characters

$ echo `expr match "$string" '\(abc[A-Z]*.2\)'`   #Result is abcABC12, the matched characters

这里转义括号的实际意义是什么\(...\)

答案1

指的是GNUexpr(coreutils 的一部分)和\(\)正在标记团体如记载于16.4.1 字符串表达式:

如果匹配成功并且正则表达式使用‘\(’and ‘\)’,则 : 表达式返回字符串中与子表达式匹配的部分;否则,返回匹配的字符数。

文档参考了3 正则表达式了解grep详细信息。这句法正则表达式的个数是记录在案在 POSIX 中:

与整个匹配是最左边匹配中最长的匹配一致,每个子模式从左到右应匹配最长的可能字符串。为此,空字符串应被视为比根本没有匹配项更长。例如,将 BRE"\(.*\).*"与匹配"abcdef",子表达式"(\1)"为“abcdef”,将 BRE"\(a*\)*"与“bc”匹配,子表达式"(\1)"为空字符串。

POSIXexpr提到了带有运算符的正则表达式:

expr1 : expr2

但接着说:

字符串参数的使用length,子字符串,指数, 或者match产生未指定的结果。

所以这个特殊的用法似乎是一个扩展。

的 POSIX 用法:详细记录在 参考资料 部分匹配表达式;这匹配此处看到的运算符对应于:,但其位置更改为字首:POSIX使用的运算符(两个运算符之前)中缀(两个操作数之间)。

作为一个群体来看,长度等,可以被视为扩大(提供无法通过特定实用程序实现的功能的非标准功能)或仅仅是非标准(执行可以通过不同方法完成的功能的不兼容方式)。这个是混合的:POSIX shell 提供了类似的功能长度等,如有关部分所述参数替换, IE,${#parameter}。然而子字符串指数没有明显的完全等价物。 (尽管语法不同,但整个组可能基于awk)。

答案2

当模式包含子表达式时\(...\),将返回匹配的字符串。这种行为是由 POSIX 指定:

或者,如果模式包含至少一个正则表达式子表达式“[\(...\)]”,则应返回与反向引用表达式“\1”匹配的字符串。如果反向引用表达式“\1”不匹配,则应返回空字符串。

请注意,您应该将命令更改为:

expr "$string" : '\(abc[A-Z]*.2\)'

使其在所有 POSIX 兼容的环境中工作expr。的用途match未指定。

答案3

反斜杠括号\(...\)创建“捕获组”。expr match似乎返回第一个捕获组。

相关内容