regex - 使用正则表达式捕获特定行(如果存在)

标签 regex

如果我有文件可能是:

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)?$)

RegEx Demo

正则表达式详细信息:

  • ^:起始行
  • (:启动捕获组 #1
    • 数字::匹配数字:文本
    • (?:\n.+)*?:匹配行中后跟 1 个以上字符的换行符。重复此操作 0 次或多次(非贪婪)
  • ):结束捕获组#1
  • (?:\n(?:999)?$):后面必须跟换行符和 999 或空行

关于regex - 使用正则表达式捕获特定行(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69124381/

相关文章:

python - Python 中的捕获群体和贪婪

javascript - Javascript RegEx 查询

iphone - NSRegularExpression 用于从字符串中检索数字

Python 字符串修剪

java - 用于提取包含管道字符的文本的正则表达式

regex - 在 VI 编辑器中将每个出现的正则表达式匹配替换为特定的正则表达式?

html - html5 输入类型 url 验证中的模式

php - 为什么这个正则表达式在添加 anchor 时失败?

java - 从命令窗口输出中获取特定子字符串(来自 ping 的时间)

使用 BINARY 运算符时使用德语变音符号进行 MySQL REGEXP 字边界检测