首页 > 解决方案 > 为什么bash if =~ regex negate a character 不起作用

问题描述

test="blah*blah"
if ! [[ ${test} =~ [\*] ]] ; then echo ok; else echo failed; fi

=> 失败

test="blah/blah"
if ! [[ ${test} =~ [\*] ]] ; then echo ok; else echo failed; fi

=> 好的

test="blah/blah"
if [[ ${test} =~ [^\*] ]] ; then echo ok; else echo failed; fi

=> 好的

test="blah*blah"
if [[ ${test} =~ [^\*] ]] ; then echo ok; else echo failed; fi

=> 好的???为什么 ?

对字符串中某处的字符使用否定模式的秘诀是什么?

标签: regexbash

解决方案


您的正则表达式(无需*在括号表达式内转义)

[^*]

匹配任何不是.的单个字符*。因为正则表达式没有隐式锚定,只要字符串中的任何字符不是 a *,匹配成功。锚定它

^[^*]$

完全匹配那些不是*. 它不再匹配任何字符串。

如果在其后添加 a ,您将获得一个匹配 0 个或多个非连续字符*的正则表达式。锚定它会为您提供一个正则表达式,该表达式匹配仅由非字符组成的任何字符串(包括空字符串)。**

^[^*]*$

如果您只想匹配非空字符串,请确保字符串以非*字符开头,而不是检查其余的(如果有的话)也不是*

^[^*][^*]*$

这可以通过使用+而不是*重复来缩短。(*匹配 0 个或更多;+匹配 1 个或更多。)

^[^*]+$

推荐阅读