我有以下问题。
我们接受输入(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()
是词法分析器当前实现的必要条件。必须这样,因为这是词法分析器工作方式的自然方式:它们匹配输入流中的序列。
答案 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)
正则表达式是众所周知的过度使用,不适合解析这样的语言。你可以暂时使用它,但最终你会发现一些破坏你的解析器的东西,需要在调整后进行调整以及一个庞大的单元测试库以确保合规性。
你应该认真考虑写一个合适的词法分析器和解析器。