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