问题
我有一堆需要在某些代码中使用的正则表达式,但是我使用的是不支持正则表达式的编程语言!幸运的是,我知道测试字符串将具有最大长度,并且仅由可打印的ASCII组成。
挑战
你必须输入一个正则表达式和一个号码n
,并输出每一个可打印的ASCII(ASCII码32至126以下,组成的字符串到
~
长的,没有突出部或换行符)小于或等于n
相匹配的正则表达式。您可能根本不会在代码中使用内置的正则表达式或正则表达式匹配函数。正则表达式将限于以下内容:
- 文字字符(和转义字符,使字符成为文字,因此
\.
是一个文字.
,\n
是一个文字n
(等效于justn
),并且\w
等价于w
。您不需要支持转义序列。) .
-通配符(任何字符)- 字符类,
[abc]
表示“ a或b或c”,[d-f]
表示从d到f的任何值(所以d或e或f)。在字符类中唯一具有特殊含义的字符是[
和]
(总是会被转义,所以不必担心),\
(当然是转义符),^
是在字符类的开头(这是一个否定) )和-
(这是一个范围)。 |
-OR运算符,交替。foo|bar
表示foo
或bar
,并且(ab|cd)e
匹配abe
或cde
。*
-匹配先前的令牌重复零次或多次,贪婪(它尝试重复尽可能多的次数)+
-重复一次或多次,贪婪?
-零或一遍- 带括号的分组,为组令牌
|
,*
。+
, 要么?
输入正则表达式将永远是有效的(也就是说,你不必处理像输入?abc
或(foo
或任何无效的输入)。您可以按任意顺序输出字符串,但是每个字符串只能出现一次(不输出任何重复项)。
测试用例
输入:.*
,1
输出:(空字符串), ,, ,... ,
!
"
}
~
输入:w\w+
,3
输出:ww
,www
输入:[abx-z][^ -}][\\]
,3
输出:a~\
,b~\
,x~\
,y~\
,z~\
输入:ab*a|c[de]*
,3
输出:c
,cd
,ce
,aa
,cde
,ced
,cdd
,cee
,aba
输入:(foo)+(bar)?!?
,6
输出:foo
,foo!
,foofoo
,foobar
输入:(a+|b*c)d
,4
输出:ad
,cd
,aad
,bcd
,aaad
,bbcd
输入:p+cg
,4
输出:pcg
,ppcg
输入:a{3}
,4
输出:a{3}
获胜者,冠军
这是代码高尔夫球,所以最短的代码(以字节为单位)将获胜!
|
几乎没有道理。它似乎无法处理嵌套的组或a|b|c
。在串联和交替绑定的强度方面,使用标准解释有什么问题?(而且您没有不使用沙箱的借口)