regex 如何使用正确的正则表达式捕获组匹配多行文本?

fcg9iug3  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(113)

我尝试读取CSV并使用正则表达式捕获组拆分每一行。CSV的最后一列中有换行符,我的正则表达式的第二个捕获组似乎在第一次出现该换行符时中断,无法捕获字符串的其余部分。
下面是我目前所做的工作。第一条记录总是以ABC-开头,所以我将它放在第一个捕获组中,它之后的所有内容,直到下一次出现ABC-或文件结束(如果是最后一条记录),都应该由第二个捕获组捕获。第一行按预期工作,因为其中没有换行符,但其余的不会。
我的正则表达式:([A-Z1-9]+)-\d*,(.*)
我的测试字符串:

ABC-1,01/01/1974,X1,Y1,Z1,"RANDOM SINLGE LINE TEXT 1",
ABC-2,01/01/1974,X2,Y2,Z2,"THIS IS
A RANDOM

MULTI LINE
TEXT 2",
ABC-3,01/01/1974,X3,Y3,Z3,"THIS IS

ANOTHER RANDOM
MULTI LINE TEXT",

预期结果为:
3次匹配

    • 匹配1:**

第1组:ABC-1,
第2组:1974年1月1日,X1、Y1、Z1,"随机单线文本1",

    • 匹配项2:**

第1组:ABC-2,
第2组:1974年1月1日,X2,Y2,Z2 ",这是
随机
多线
文本2 ",

    • 匹配3:**

第1组:ABC-3,
第2组:1974年1月1日,X3,Y3,Z3 ",这是
另一项随机
多行文本",

bxjv4tth

bxjv4tth1#

您可以使用

^([A-Z]+-\d+),(.*(?:\n(?![A-Z]+-\d+,).*)*)

请参见regex demo。仅使用带有 * multiline * 标志的regex demo(如果它不是Ruby,因为^已经匹配Ruby中的行开始位置)。

  • 详细信息 *:
  • ^-行的开始
  • ([A-Z]+-\d+)-第1组:一个或多个大写ASCII字母,然后是-和一个或多个数字
  • ,-逗号
  • (.*(?:\n(?![A-Z]+-\d+,).*)*)-组2:
  • .*-生产线的其余部分
  • (?:\n(?![A-Z]+-\d+,).*)*-不以一个或多个大写ASCII字母开头的零行或多行,然后是-和一个或多个数字+逗号
slhcrj9b

slhcrj9b2#

您可以尝试通过前瞻Assert来限制第二组:

(ABC-\d+,)(.*?(?=^ABC|\z))

这里。

相关问题