或在`expr match`

str*_*cer 6 shell-script regular-expression

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

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

它输出0。

Lam*_*ert 7

你的命令应该是:

expr match Unauthenticated123 'Unauthenticated\|Authenticated'
Run Code Online (Sandbox Code Playgroud)

如果要匹配的字符数。

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

expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)'
Run Code Online (Sandbox Code Playgroud)

来自info coreutils 'expr invocation'

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

     如果匹配成功并且 REGEX 使用了 `\(' 和 `\)',则 `:'
     表达式返回 STRING 中匹配的部分
     子表达式;否则,它返回字符数
     匹配。

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

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

     在正则表达式中,“\+”、“\?”和“\|” 是运营商
     分别匹配一个或多个,零或一个,或分开
     备择方案。SunOS 和其他“expr”将这些视为常规
     人物。(POSIX 允许任何一种行为。) *Note 正则
     表达式库:(regex)Top,正则表达式详解
     句法。一些例子在 *noteExpr:: 的例子中。


Sté*_*las 5

请注意,match\|都是 GNU 扩展(以及模式开始时:match标准等价物)的行为^因实现而异)。通常,你会这样做:

expr " $string" : " Authenticated" '|' " $string" : " Unauthenticated"
Run Code Online (Sandbox Code Playgroud)

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

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

expr + "$string" : 'Authenticated\|Unauthenticated'
Run Code Online (Sandbox Code Playgroud)

即使它恰好是一个操作符,也将被视为字符串的+力。正则表达式是基本的正则表达式,没有交替运算符(并且 where不是特殊的)。GNU 实现将其视为扩展。$stringexprexpr|\|

如果您只想检查是否$stringAuthenticated或开头,则Unauthenticated最好使用:

case $string in
  (Authenticated* | Unauthenticated*) do-something
esac
Run Code Online (Sandbox Code Playgroud)