【发布时间】:2011-10-22 20:57:55
【问题描述】:
我有一个字符串,其中包含由多个字符分隔的序列:<< 和 >>。我需要一个正则表达式来只给我 innermost 序列。我已经尝试过前瞻,但它们似乎没有按我期望的方式工作。
这是一个测试字符串:
'do not match this <<but match this>> not this <<BUT NOT THIS <<this too>> IT HAS CHILDREN>> <<and <also> this>>'
它应该返回:
but match this
this too
and <also> this
正如您在第三个结果中看到的那样,我不能只使用/<<[^>]+>>/,因为字符串可能有一个分隔符字符,但不能连续两个。
我刚从试错中解脱出来。在我看来这不应该这么复杂。
【问题讨论】:
-
理论上,这类问题(堆栈式,取决于某些中间状态等)需要比常规语法更具表现力。
-
正则表达式只能解析正则文法。这不是常规语法。
-
Perl 的正则表达式根本不是正则的,可以很好地解析。
-
@miku, @cdhowie:因为他想要内括号而不是外括号,所以实际上有一个规则的语法。
/<<(?:[^<>]+|<[^<]|>[^>])*>>/ -
@ikegami:比这更复杂;不匹配所有
<<<>>
标签: regex perl delimiter lookahead