222224466888AA Expected
"BEGIN\n\nEND\n\nBEGIN\n a\nEND\n"
22222334455555555555555555566888AA Got
111 22222 333 44 55555 66 777 888 999 AA
/\s* BEGIN \s* \n (.*?) \n \s* END \s* \n/xsg
尝试一些正如你所看到的,不符合预期的第一件事就是BEGIN
后\s*
。您希望\s*
匹配除换行符之外的任何空格,这可以使用[^\S\n]*
完成。
/^ [^\S\n]* BEGIN [^\S\n]* \n (.*?) \n [^\S\n]* END [^\S\n]* \n/xsmg
正如你所看到的,使用时避免匹配一些非贪婪修改是容易失败。如果你想要的东西更强大的,你会用下面的习惯:
(?:(?!STRING).)*
是STRING
为[^CHAR]*
是CHAR
这将使你
/
^[^\S\n]* BEGIN [^\S\n]* \n
((?:(?!^[^\S\n]* (?: BEGIN | END) [^\S\n]* \n).)*) \n
[^\S\n]* END [^\S\n]* \n
/xsmg
我不知道Perl,但我在C#中试过,它工作。 –
'。*?'* does *匹配空字符串:'perl -We'$ _ =“”;打印“匹配”如果/.*?/;'' – ThisSuitIsBlackNot
我得到了和你一样的结果。 '。*?'确实匹配“,但显然仍然很贪婪。 – iamnotmaynard