str*_*cer 6 shell-script regular-expression
我很困惑为什么这不匹配:
expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'
它输出0。
你的命令应该是:
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:: 的例子中。
请注意,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|\|
如果您只想检查是否$string以Authenticated或开头,则Unauthenticated最好使用:
case $string in
(Authenticated* | Unauthenticated*) do-something
esac
Run Code Online (Sandbox Code Playgroud)