正则表达式在第一场比赛中包括两场比赛

Regex includes two matches in first match

我有 this regex 试图找到单独的 STEP 行并将其分成三组参考编号、class 和属性:

#14=IFCEXTRUDEDAREASOLID(#28326,#17,#9,3657.6);

变成

[['14'], ['IFCEXTRUDEDAREASOLID'], ['#28326,#17,#9,3657.6']]

有时这些行有任意换行符,尤其是在属性之间,所以我在正则表达式中放了一些 \s 。然而,这会导致一个有趣的错误。该模式现在将两行匹配到每个匹配项中。

即使有换行符,我如何调整正则表达式使其只捕获一行?只是出于好奇,为什么它在第二行之后停止而不继续到最后一行?

你可以试试这个:

#(\d+)\s*=\s*([a-z0-9]+)\s*\([^;]*\);

Your updated link

现在每次匹配2行的原因是\s匹配任何空格,如果匹配一行后有换行符,\s*将全部抓取。

使用

/^#(\d+)\s*=\s*([a-zA-Z0-9]+)\s*\(((?:'[^']*'|[^;'])+)\);/gm

this regex demo

详情:

  • ^ - 行首
  • # - 哈希符号
  • (\d+) - 第 1 组:一个或多个数字
  • \s*=\s* - = 包含可选的空格
  • ([a-zA-Z0-9]+) - 第 2 组捕获 1+ 个字母数字
  • \s*\( - 0+ 个空格和一个 (
  • ((?:'[^']*'|[^;'])+) - 第 3 组捕获 '...' 个子字符串('[^']*',内部不允许 ')或(|)1+ 个其他字符比 ;' ([^;']+)
  • \); - ); 序列

否定字符 class 解决方案 适用于特定情况,但一旦使用 ([\s\S]*?) 捕获的文本包含否定字符,匹配就会失败。