我有问题解析文本到数组
我的正则表达式:
/'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
};
)
用?
: (.*?)
使*
量词变懒
也可以简化您的正则表达式,('w*[.'s'w]*|)
与([.'s'w]*)
相同(这里的.
代表点,而不是任何字符):
/'s*DEF's+FUNC's+('w+'d*)'([.'s'w]*')'s*{'s*(.*?)'s*}/s
这是因为贪婪。块内的.*
将尽可能多地读取任何内容,这意味着最后一个}
将是文本中的最后一个。
可以在*
量词后加一个问号。
/DEF's+FUNC's+(?:'w+'d*)'([.'s'w]*')'s*{.*?}/s
我也简化了正则表达式如下:
- 使捕获组不捕获,并删除不需要的组
- 前导空格似乎没有必要
-
('w*[.'s'w]*|)
与[.'s'w]*
相同 - 在块内,
.*
已经处理了周围的空白
最后,这个正则表达式不是很可靠。如果在DEF
的块中有一个闭花括号}
,那么它会把一切都搞砸。没有办法使用正则表达式正确地做到这一点。
如果你真的很认真,那么写一个小解析器可能是一种方法。