目标
今天的 Code Golf 挑战是用尽可能少的字符创建一个正则表达式解析器。
语法
不,我不是要你匹配 Perl 风格的正则表达式。毕竟,已经有一个非常可靠的口译员了!:-)
以下是您需要了解的有关此挑战的正则表达式语法的所有信息:
- 术语被定义为单个文字字符,或分组括号内的正则表达式
()
。 - (
*
星号)字符表示上一个 TERM 上的Kleene 星号操作。这意味着前一个术语的零个或多个,连接在一起。 - (
+
加号)字符代表一个方便的快捷方式:a+
相当于aa*
,表示一个或多个前一个术语。 - (
?
问号)字符表示前一个术语的零个或一个。 - (
|
竖线)字符表示交替,这意味着任何一方的正则表达式都可以在匹配中使用。 - 所有其他字符都假定为文字。您可以假设所有其他字符都在其中
[0-9A-Za-z]
(即所有英文字母数字)。
或者,换一种说法://*
具有最高优先级,然后是串联,然后是交替。由于交替的优先级低于串联,因此在不带括号的正则表达式中使用它会导致它被绑定到每一侧的完整正则表达式。另一方面,and仅适用于前一个术语。+
?
*
+
?
挑战
您的挑战是编写一个程序来编译或解释正则表达式(如上定义),然后针对它测试一些字符串。
我把输入留给你。我的建议是,正则表达式可能应该首先出现,然后是任意数量的要对其进行测试的字符串;但如果你想坚持下去,那很好。如果您想将所有内容放入命令行参数或标准输入中,或者将正则表达式放入命令行中,将字符串放入标准输入中,或者其他任何东西,那很好。只需显示一个或两个使用示例。
输出应该是true
or 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!:-(