如何使用正则表达式匹配无标点文本中的全部相邻滑动单词对
正则调整方案
问题原因
原来的(\w+) +(\w+)采用字符消费式匹配:完成hello dear的匹配后,正则引擎的扫描指针会直接移动到dear的末尾,剩余仅world一个单词无法满足双单词匹配规则,因此只能输出首个相邻对。
解决方案
使用PCRE正则的正向零宽先行断言实现滑动窗口效果,断言匹配过程不会消耗字符,可让扫描指针每匹配完一组仅前进一个单词的长度,实现所有相邻对的捕获。
调整后命令
echo "hello dear world" | grep -Po '(?=(\b\w+ +\w+))\b\w+'
输出结果
hello dear dear world
说明
- 替换
-E参数为-P:POSIX扩展正则不支持零宽断言,需启用PCRE正则支持 - 正则逻辑:
(?=...):正向零宽先行断言,仅检查后续内容匹配规则,不消耗扫描位置的字符(\b\w+ +\w+):捕获完整的相邻单词对,\b保证匹配完整单词边界- 末尾的
\b\w+:控制扫描指针每次前进一个单词,避免同一位置重复匹配
多单词场景验证
输入4个单词的测试用例:
echo "a b c d" | grep -Po '(?=(\b\w+ +\w+))\b\w+'
输出:
a b b c c d
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

