【问题标题】:bash extended regex operatorsbash 扩展的正则表达式运算符
【发布时间】:2012-09-27 04:49:10
【问题描述】:

我正在尝试使用 bash 中可用的扩展正则表达式运算符(?、*、+、@、!)。手册说我只需要用括号括起来模式列表,然后在左括号之前使用运算符。所以如果我想要一个零个或多个 a 的模式:

if [[ "$1" =~ *(a) ]]
then
   echo $1
fi

但这不起作用。我做错了什么?

【问题讨论】:

标签: regex bash


【解决方案1】:

man bash

一个额外的二元运算符 =~ 可用,具有相同的 优先级为==!=。使用时,右边的字符串 该运算符被认为是扩展的正则表达式,并且 相应地匹配(如regex(3))。如果返回值为 0 字符串匹配模式,否则为 1。如果常规 表达式在语法上不正确,条件 表达式的返回值为2。如果shell选项nocasematch 启用时,匹配的执行不考虑大小写 字母字符。模式的任何部分都可以引用到 强制它作为字符串匹配。匹配的子串 保存正则表达式中带括号的子表达式 在数组变量BASH_REMATCH 中。 BASH_REMATCH 的元素与 索引 0 是与整个字符串匹配的部分 正则表达式。 BASH_REMATCH 的索引为 n 的元素是 匹配第 n 个带括号的子表达式的字符串部分。

我在这里引用了整件事,因为我认为了解它很有用。您在右侧使用标准 POSIX 扩展正则表达式。

特别是,右侧的表达式可能匹配左侧操作数的子字符串。因此,要匹配整个字符串,请使用 ^$ 锚点:

if [[ "$1" =~ ^a*$ ]]
then
    echo $1
fi

【讨论】:

  • 我现在明白了。括号用于不使用 =~ 运算符的情况。
  • 对。所以如果你做shopt -s extglob,你可以做ls *(a)列出所有由as组成的文件。
猜你喜欢
  • 2013-10-26
  • 2022-01-22
  • 1970-01-01
  • 2014-03-17
  • 2012-10-30
  • 2016-09-26
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多