我有这个正则表达式,它试图找到单个 STEP-lines 并将其分为参考号、类和属性的三个集合:
#14=IFCEXTRUDEDAREASOLID(#28326,#17,#9,3657.6);
成为
[['14'], ['IFCEXTRUDEDAREASOLID'], ['#28326,#17,#9,3657.6']]
有时这些行有任意换行符,尤其是在属性之间,所以我在正则表达式中放了一些 \s。然而,这会产生一个有趣的错误。现在,该模式将两行匹配到每个匹配项中。
如何调整正则表达式以仅捕获一行,即使它们有换行符?只是出于好奇,为什么它在第二行之后停止而不持续到最后一行?
您现在每次都匹配 2 行的原因是s
匹配任何空格,如果匹配一行后有换行符,s*
将全部抓取。
用
/^#(d+)s*=s*([a-zA-Z0-9]+)s*(((?:'[^']*'|[^;'])+));/gm
查看此正则表达式演示
详情:
-
^
- 行的开头 -
#
- 哈希符号 -
(d+)
- 第 1 组:一个或多个数字 -
s*=s*
- 用可选空格括起来的=
-
([a-zA-Z0-9]+)
- 第 2 组捕获 1+ 字母数字 -
s*(
- 0+ 空格和(
-
((?:'[^']*'|[^;'])+)
- 第3组捕获'...'
子字符串('[^']*'
,不允许内部'
)或(|
)除;
和'
以外的1+字符([^;']+
) -
);
-);
序列
Maverick_Mrt建议的否定字符类解决方案适用于特定情况,但是一旦使用 ([sS]*?)
捕获的文本包含否定字符,匹配将失败。
你可以试试这个:
#(d+)s*=s*([a-z0-9]+)s*([^;]*);
您更新的链接