regex - 为什么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
=> 好的???为什么 ?
对字符串中某处的字符使用否定模式的秘诀是什么?
解决方案
您的正则表达式(无需*
在括号表达式内转义)
[^*]
匹配任何不是.的单个字符*
。因为正则表达式没有隐式锚定,只要字符串中的任何字符不是 a *
,匹配成功。锚定它
^[^*]$
完全匹配那些不是*
. 它不再匹配任何字符串。
如果在其后添加 a ,您将获得一个匹配 0 个或多个非连续字符*
的正则表达式。锚定它会为您提供一个正则表达式,该表达式匹配仅由非字符组成的任何字符串(包括空字符串)。*
*
^[^*]*$
如果您只想匹配非空字符串,请确保字符串以非*
字符开头,而不是检查其余的(如果有的话)也不是*
。
^[^*][^*]*$
这可以通过使用+
而不是*
重复来缩短。(*
匹配 0 个或更多;+
匹配 1 个或更多。)
^[^*]+$
推荐阅读
- c++ - 在 C++ 中使用内联方法时出现未定义符号错误
- javascript - Javascript - 创建一个返回参数列表的柯里化函数
- apache - 涉及 RewriteMap 小写的 Apache htaccess 规则 - 转换为 Nginx 规则
- javascript - multer处理的视频没有声音
- javascript - Yargs : 在失败函数中访问已处理的 argv
- php - CodeIgniter join() 不显示逗号分隔值
- gradle - 如何在 buildSrc/build.gradle.kts、settings.gradle.kts 和 build.gradle.kts 中导入 helper 类?
- java - 带有 MySQL 的 Java 插入按钮添加到数据库和表
- python - 为什么 Google Colab 在 csv 和 jupyter notebook 中阅读时会引发错误?
- react-native - Comet Chat Pro 音频/视频通话 API 支持