如何使用正则表达式提取包括换行符在内的文本直到匹配位置

3
我已经使用正则表达式成功地提取了“Abc 123”后面的任何内容,但它无法从新行中提取任何内容。

enter image description here

有没有办法使用正则表达式提取以下内容:

"Abc 123 def
ghi
jkl"
"Abc 123 def ghi jkl mno"
"Abc 123 def ghi jkl 
mno"

我正在使用Talend中的正则表达式。


1
你似乎在询问代码无法运行的问题,但是你忘记贴出那段代码了。提示:花费更少的时间来创建截图,只需将你正在使用的文本放下即可。这样对每个人都更容易处理。 - GhostCat
尝试使用正则表达式/^(\w+)\s(\d+)(.*(?:\r?\n(?!\w+\s\d).*)*)/gm。不确定您是否指定了正确的预期输出。 - Wiktor Stribiżew
@WiktorStribiżew 你期望的输出是什么? - xenteros
1
@light 看起来你正在尝试分割输入,是吗?你在Talent的哪个具体产品/功能中使用正则表达式? - Bohemian
@Bohemian 评论得对,为什么不在 \n(?=\w+ \d) 处拆分字符串呢?或者你的环境不支持这样做? - bobble bubble
显示剩余2条评论
2个回答

1
我认为您想要提取以1个或多个单词字符开头、接着是一个空格、然后是1个或多个数字,并跨越多行直到相同模式的子字符串。

您可以使用以下正则表达式(请注意,标志和表示法可能因您使用的语言而异):

/^(\w+)\s(\d+)(.*(?:\r?\n(?!\w+\s\d).*)*)/gm

请查看正则表达式演示

详细信息

  • ^ - 行首
  • (\w+) - 第一组:一个或多个单词字符
  • \s - 一个空白字符
  • (\d+) - 第二组:一个或多个数字
  • (.*(?:\r?\n(?!\w+\s\d).*)*) - 第三组:
    • .* - 除换行符外的任意0个或多个字符
    • (?:\r?\n(?!\w+\s\d).*)* - 零个或多个序列:
      • \r?\n - 换行符...
      • (?!\w+\s\d) - 不跟随1个或多个单词字符、空格、1个或多个数字的内容
      • .* - 除换行符外的任意0个或多个字符

0

(\w)+\s(\d+)((.|\R)+) 是你想要的,所以在转义后它应该是:(\\w)+\\s(\\d+)((.|\\R)+)
\R 是 Java 正则表达式中自 Java 8 可用的新组 - 它代表换行符。包括: \r\n\n

如果你只允许一个换行符:
(\w)+\s(\d+)((.+)(\R.+){0,1})

我认为你应该更明确地指定你想要的输出,但从这个答案中你可以学习如何包含多行或最多两行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接