如果我有文件可能是:
numbers:
32
45
999
56
或
numbers:
23
45
56
999
是一个常数,但其他数字和行数会发生变化。
有没有办法捕获:
- 在第一种情况下,在
999
上方,后跟一个空行(即排除999
) - 在第二种情况下的空行上方,其中
999
不存在
到目前为止我已经尝试过:
(numbers:(?:\n.+)*)(\n999)
— 这在第一种情况下效果很好;第一组捕获 999 以上的所有内容。显然,在没有999
的地方它不起作用,所以...(numbers:(?:\n.+)*)(\n999)?
— 我本以为这适用于这两种情况。但在第一种情况下,这捕获了第一组中的999
,我猜是因为它很贪婪,而?
使得(\n999)
可选,因此第一组可以自由捕获它。
也有可能我把这个问题过于复杂化了,并且有一些简单的解决方案。
非常感谢!
最佳答案
这是一个正则表达式,它不使用前瞻:
^(numbers:(?:\n.+)*?)(?:\n(?:999)?$)
正则表达式详细信息:
^
:起始行(
:启动捕获组 #1数字:
:匹配数字:
文本(?:\n.+)*?
:匹配行中后跟 1 个以上字符的换行符。重复此操作 0 次或多次(非贪婪)
)
:结束捕获组#1(?:\n(?:999)?$)
:后面必须跟换行符和999
或空行
关于regex - 使用正则表达式捕获特定行(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69124381/