我有解析文本到数组
的问题我的正则表达式:
/\s*DEF\s+FUNC\s+(\w+\d*)\((\w*[.\s\w]*|)\)\s*{\s*(.*)\s*}/s
我的文字:
DEF FUNC test(param)
{
test1;
};
DEF FUNC testSecond()
{
test1
test1
};
它应该返回如下数组:
(
[0] => DEF FUNC test(param)
{
test1;
};
[1] => DEF FUNC testSecond()
{
test1
test1
};
)
但现在我在数组中只有一个元素:
(
[0] => DEF FUNC test(param)
{
test1;
};
DEF FUNC testSecond()
{
test1
test1
};
)
我该如何解决这个问题?
答案 0 :(得分:1)
使用*
:?
使(.*?)
量词变得懒惰。
此外,您的正则表达式可以简化,(\w*[.\s\w]*|)
与([.\s\w]*)
相同(此处的.
代表点,而不是任何字符):
/\s*DEF\s+FUNC\s+(\w+\d*)\([.\s\w]*\)\s*{\s*(.*?)\s*}/s
答案 1 :(得分:0)
这是因为贪婪。块内的.*
将尽可能多地读取任何内容,这意味着最后}
将是文本中的最后一个。{/ p>
为了使其不贪婪,你可以在*
量词之后加上一个问号。
/DEF\s+FUNC\s+(?:\w+\d*)\([.\s\w]*\)\s*{.*?}/s
我还简化了正则表达式,如下所示:
(\w*[.\s\w]*|)
与[.\s\w]*
.*
已经处理了周围的空白区域最后,这个正则表达式不是很可靠。如果在}
的块内某处有一个结束大括号DEF
,那么它会把所有东西搞砸。使用正则表达式无法正确执行此操作。
如果你真的很认真,那么写一个小解析器可能就好了。