REGEX(PCRE)仅在零或一次匹配时匹配

时间:2010-11-11 19:11:59

标签: php regex pcre

我有以下问题。

我们接受输入(wikitext)

======hello((my first program)) world======

我想要匹配“你好”,“我的第一个节目”和“世界”(注意空间)。

但是对于输入:

======hello(my first program)) world======

我想要匹配“你好(我的第一个节目”和“世界”。

换句话说,我希望匹配任何字母,空格和任何单个符号(不得加倍或更多)。

这应该使用unicode字符属性来完成,例如\ p {L},\ p {S}或\ p {Z},记录为here

有什么想法吗?

附录1

正则表达式只需在unicode术语中的任何双符号或标点符号之前停止,即在任何\ p {S} {2,}或\ p {P} {2,}之前停止。

我不是要用这个解析整个wiki文本,请仔细阅读我的问题。正在寻找正在使用的词法分析器的正则表达式,并使其匹配这些输入将极大地简化我的解析器。

附录2

该模式必须与preg_match()一起使用。我可以想象我必须先拆分它。也许它会使用一些前瞻,我不知道,我已经尝试了我能想象到的一切。

仅使用preg_match()是词法分析器当前实现的必要条件。必须这样,因为这是词法分析器工作方式的自然方式:它们匹配输入流中的序列。

2 个答案:

答案 0 :(得分:1)

return preg_split('/([\pS\pP])\\1+/', $theString);

结果:http://www.ideone.com/YcbIf

(你需要手动删除空字符串。)


编辑:作为preg_match正则表达式:

'/(?:^|([\pS\pP])\\1+)((?:[^\pS\pP]|([\pS\pP])(?!\\3))*)/'

匹配时取第2个捕获组。示例:http://www.ideone.com/ErTVA

但你可以只消耗([\pS\pP])\\1+并丢弃,或者如果不匹配,则消耗(?:[^\pS\pP]|([\pS\pP])(?!\\3))*并记录,因为你的词法分析器将使用多于1个正则表达式?

答案 1 :(得分:0)

正则表达式是众所周知的过度使用,不适合解析这样的语言。你可以暂时使用它,但最终你会发现一些破坏你的解析器的东西,需要在调整后进行调整以及一个庞大的单元测试库以确保合规性。

你应该认真考虑写一个合适的词法分析器和解析器。