正则表达式用于匹配括号之间的任何内容

正则表达式用于匹配括号之间的任何内容

到目前为止我有以下正则表达式:

printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'

上面的正则表达式将打印所需的输出,即测试网

据我在代码中添加新的括号

printf "this is (test.com) and (alex)\n" | grep -Po '(?<=\().*(?=\))'

,它显示如下内容:

test.com)和(亚历克斯

我希望我的正则表达式能够打印括号之间的任何内容(无论有多少)。此外,我想添加一个条件来仅打印括号之间具有特定长度的单词。

例如:(aaa)test1(bbb)测试测试(ccc)测试(示例)(ddd)

我只想打印出括号内长度为 3 的单词。因此输出应该是:

aaa bbb ccc ddd

答案1

请注意表达式尽量选择的模式最大限度长度 ( gready regex) 匹配。正如您在示例中看到的(正则表达式:括号之间的符号)已选择

  • ...是 (test.com)和(亚历克斯

代替

  • ...是 (测试网) 和 (亚历克斯

有两种方法可以覆盖此类行为:

  1. 替换any symbolrevers match限制或除法符号(例如:(.*)通过([^)]*)
  2. 现代正则表达式(例如 PCRE)允许将量词指定为懒惰的。他们在量词后面加了一个问号以使其变得懒惰.*?。通过使用惰性量词,表达式首先尝试最小匹配。

与第一个变体相比,更多的是允许简化正则表达式:grep -Po '\(\K[^)]*'

相关内容