3

我有这个正则表达式,它试图找到单独的 STEP 行并将其分为三个组的参考号、类和属性:

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

变成

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

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

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

4

2 回答 2

2

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

采用

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

看到这个正则表达式演示

详情

  • ^ - 一行的开始
  • #- 一个哈希符号
  • (\d+)- 第一组:一位或多位数字
  • \s*=\s* -=用可选空格括起来
  • ([a-zA-Z0-9]+)- 第 2 组捕获 1+ 字母数字
  • \s*\(- 0+ 个空格和一个(
  • ((?:'[^']*'|[^;'])+)- 第 3 组捕获'...'子字符串 ( '[^']*', 不允许'内部) 或 ( |) 除;'( [^;']+)之外的 1+ 个字符
  • \);- 一个);序列

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

于 2017-01-18T09:37:26.990 回答
1

你可以试试这个:

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

您更新的链接

于 2017-01-18T09:22:41.197 回答