OR 在 `expr match` 中

OR 在 `expr match` 中

我很困惑为什么这不匹配:

expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'

它输出 0。

答案1

你的命令应该是:

expr match Unauthenticated123 'Unauthenticated\|Authenticated'

如果你想要匹配的字符数。

要返回字符串的一部分(未经身份验证),请使用:

expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)'

info coreutils 'expr invocation'

`字符串:正则表达式'
     执行模式匹配。参数被转换为字符串
     第二个被认为是(基本的,GNU `grep')
     正则表达式,隐式前置“^”。首先
     然后将参数与该正则表达式进行匹配。

     如果匹配成功并且 REGEX 使用“\(”和“\)”,则“:”
     表达式返回 STRING 中与
     子表达式;否则,返回字符数
     匹配。

     如果匹配失败,则“:”运算符返回空字符串 if
     REGEX 中使用“\(”和“\)”,否则为 0。

     只有第一个“\( ... \)”对与返回值相关;
     附加对仅对常规分组有意义
     表达式运算符。

     在正则表达式中,“\+”、“\?”和“\|”是运营商
     分别匹配一个或多个、零个或一个、或单独的
     备择方案。 SunOS 和其他“expr”将它们视为常规的
     人物。 (POSIX 允许这两种行为。) *注意正则
     表达式库:(regex)Top,了解正则表达式的详细信息
     句法。 *note 中的一些示例是 expr:: 的示例。

答案2

请注意, 和match都是GNU 扩展(并且当模式以 开头时(标准等效项)\|的行为因实现而异)。标准情况下,你会这样做::match^

expr " $string" : " Authenticated" '|' " $string" : " Unauthenticated"

前导空格是为了避免以or are运算$string符开头的值出现问题,但这意味着它会在匹配的字符数上加一。-expr

使用 GNU expr,你可以这样写:

expr + "$string" : 'Authenticated\|Unauthenticated'

+即使它碰巧是一个运算符,也必须将其视为$string字符串exprexpr正则表达式是基本的正则表达式,没有交替运算符(where 也不|特殊)。 GNU 实现将其视为\|扩展。

如果您只想检查是否以or$string开头,您最好使用:AuthenticatedUnauthenticated

case $string in
  (Authenticated* | Unauthenticated*) do-something
esac

答案3

$ expr match "Unauthenticated123" '^\(Unauthenticated\|Authenticated\).*'你必须用\括号和管道来转义。

相关内容