断言
当然可以!以下是一个简洁实用的「正则表达式断言速查表」,专为命令行(如 grep -P
)、Python、Perl 等支持正则断言的场景准备的。
✅ 正则断言概览(Lookahead / Lookbehind)
类型 | 语法 | 含义说明 | 示例 |
---|---|---|---|
正向前瞻断言 | (?=...) |
匹配后面必须跟着 ... 的位置 |
foo(?=bar) 匹配 foobar 中 foo |
负向前瞻断言 | (?!...) |
匹配后面不能跟着 ... 的位置 |
foo(?!bar) 匹配 foobaz 中 foo |
正向后顾断言 | (?<=...) |
匹配前面必须是 ... 的位置 |
(?<=foo)bar 匹配 foobar 中 bar |
负向后顾断言 | (?<!...) |
匹配前面不能是 ... 的位置 |
(?<!foo)bar 匹配 bazbar 中 bar |
📌 断言不是匹配字符,而是匹配“位置”
比如:
echo "abc123" | grep -P '\d(?=3)'
输出:
3
解释:
-
\d(?=3)
匹配一个数字,这个数字后面必须是3
-
所以这里只匹配
3
前面的那个3
🧠 使用建议
-
筛选包含某模式(如含
.
):grep -P '(?=.*\.).*'
-
匹配前缀是
foo
的字符串:grep -P '^(?=foo).*'
-
排除某后缀(如不是
.log
结尾):grep -P '^(?!.*\.log$).*'
🧪 测试样本(推荐用来练习):
echo -e "a.com\nb.log\nc.txt\nnoext" | grep -P '(?=.*\.).*'
输出:
a.com
b.log
c.txt
如果你有具体的过滤需求,我也可以帮你写断言语法 😎
你打算主要在哪些场景用断言?比如文件名、日志内容、IP 地址?