到目前为止我有以下正则表达式:
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)和(亚历克斯)
代替
- ...是 (测试网) 和 (亚历克斯)。
有两种方法可以覆盖此类行为:
- 替换
any symbol
为revers match
限制或除法符号(例如:(.*)
通过([^)]*)
- 现代正则表达式(例如 PCRE)允许将量词指定为懒惰的。他们在量词后面加了一个问号以使其变得懒惰
.*?
。通过使用惰性量词,表达式首先尝试最小匹配。
与第一个变体相比,更多的是允许简化正则表达式:grep -Po '\(\K[^)]*'