【发布时间】:2011-04-01 04:49:15
【问题描述】:
目标
今天的 Code Golf 挑战是用尽可能少的字符创建一个正则表达式解析器。
语法
不,我不是要你匹配 Perl 风格的正则表达式。毕竟,已经有一个非常可靠的口译员了! :-)
以下是您需要了解的有关此挑战的正则表达式语法的所有信息:
-
术语定义为单个文字字符,或分组括号
()内的正则表达式。 -
*(星号)字符表示上一个 TERM 上的 Kleene 星号操作。这意味着前一个术语的零个或多个,连接在一起。 -
+(加号)字符代表一个方便的快捷方式:a+等同于aa*,表示上一个术语的一个或多个。 -
?(问号)字符表示前一个词的零个或一个。 -
|(竖线)字符表示交替,这意味着任何一方的正则表达式都可以在匹配中使用。 - 假定所有其他字符都是文字。您可以假设所有其他字符都在
[0-9A-Za-z]内(即所有英文字母数字)。
或者,换一种说法:*/+/? 具有最高优先级,然后是串联,然后是交替。由于交替的优先级低于串联,因此在不带括号的正则表达式中使用它会导致它被绑定到每一侧的完整正则表达式。另一方面,* 和 + 和 ? 仅适用于前一个术语。
挑战
您的挑战是编写一个程序来编译或解释正则表达式(如上定义),然后针对它测试一些字符串。
我将把输入留给你。我的建议是,正则表达式可能应该首先出现,然后是任意数量的要对其进行测试的字符串;但如果你想坚持下去,那很好。如果您想将所有内容放入命令行参数或标准输入中,或者将正则表达式放入命令行中,将字符串放入标准输入中,或者其他任何东西,那很好。只显示一两个使用示例。
输出应为true 或false,每行一个,以反映正则表达式是否匹配。
注意事项:
- 我不应该这么说...但不要使用您的语言中的任何正则表达式库!您需要自己编译或解释模式。 (编辑:如果需要拆分或连接字符串,您可以使用正则表达式。您不能使用它直接解决问题,例如,将输入正则表达式转换为语言正则表达式并使用它。 )
- 正则表达式必须与此质询的输入字符串完全匹配。 (等效地,如果您熟悉类似 Perl 的正则表达式,则假设所有匹配项都具有字符串开头和结尾锚定)
- 对于这个挑战,所有特殊字符
()*+?|预计不会按字面意思出现。如果输入中出现了一个,则可以安全地假设没有任何模式可以匹配所讨论的字符串。 - 应以区分大小写的方式评估要测试的输入字符串。
例子
对于示例,我假设一切都在命令行参数中完成,首先是正则表达式。 (正如我上面所说,输入取决于您。)myregex 这里代表您对程序的调用。
> myregex easy easy Easy hard
true
false
false
> myregex ab*a aa abba abab b
true
true
false
false
> myregex 0*1|10 1 10 0110 00001
true
true
false
true
> myregex 0*(1|1+0) 1 10 0110 00001
true
true
true
true
> myregex a?b+|(a+b|b+a?)+ abb babab aaa aabba a b
true
true
false
true
false
true
注意:抱歉,忘记创建社区 wiki! :-(
【问题讨论】:
-
这是一个解释器,而不仅仅是一个解析器。
-
这是一个经过深思熟虑的高尔夫;下班后我会看看使用解析器组合器试试看;)
-
Voters for close... 有什么建议可以让您看起来更像是一个“真正的问题”吗?是的,您需要通读全文,但这绝对是一个问题:谁能用最少的击键次数编写正则表达式解析器/解释器?很简单,真的,即使很难回答。 :-)
-
我投票结束(而且我通常不会投票结束 Code-Golf 问题),因为这是一个“过于本地化”的问题。您将从了解 Code-golf 并希望花时间在 code-golf 中编写正则表达式机器的那部分人那里得到答案。除了痛苦之外,这不是很有教育意义。最好用code-golf-ese写一个*not,方便其他人学习。
-
@George Stocker:我不敢苟同——编写正则表达式匹配器既有趣又具有教育意义。即使一个人写了 1000+ 个字符中的一个,这仍然是 codegolf 的胜利......因为还没有发布工作的人:)
标签: regex language-agnostic code-golf rosetta-stone