制作一个正则表达式


19

编写一个至少可以在2种正则表达式版本(或版本)中运行的正则表达式,并在其运行的每种版本(或版本)中匹配一个不同的字符串。

在此挑战中要匹配的字符串是Ubuntu代码名称的第一个单词,下面列出。您的正则表达式必须与列表顶部匹配。也就是说,如果您的正则表达式可以使用3种样式,则必须与Warty Hoary和匹配Breezy,而不是其他。

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

如果您的正则表达式可以使用超过26种口味,则可以匹配Ubuntu版本号。从17.10开始,对于每个新口味,如果第二个数字为04,则将其更改为10,然后将第一个数字递增,将第二个数字更改为04。

在每种形式中,您的正则表达式应仅匹配假定的字符串,而不匹配其他字符串(不限于代码名称)。尾随换行符无关紧要。这意味着您的正则表达式可以只匹配不带尾随换行符的字符串,仅匹配带尾随换行符的字符串,或者匹配两者。而且不必在不同口味上保持一致。您可以假定输入使用可打印的ASCII(末尾的换行符除外,如果有的话)。

您的分数是(代码长度+10)/((风味数)^ 2)。最低分获胜。


1
只是要检查-通过“在每种形式中,您的正则表达式应该只匹配假定的字符串,而不能匹配其他任何字符。”,这是否意味着每个正则表达式应该只匹配一个Ubuntu版本名称,而不匹配其他名称,但可以匹配其他非版本名称。名称字符串,或者这表示正则表达式只能匹配该确切字符串,而不能匹配其他字符串,即使它不是上面列表中的版本名称也是如此?
Sp3000 '16

@ Sp3000它应该匹配那个确切的字符串,而不是其他字符串。
jimmy23013

Answers:


24

87字节,5种口味,(87 + 10)/ 25 = 3.88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

我现在使用了易于测试的口味,这些口味是:

总体结构为^((...)y|...)$,即排除尾随ys并添加锚点。

警惕(PCRE)

(?=W)[[:word:]&&]art

在PCRE和Ruby中,[[:word:]]是一个与单词字符匹配的POSIX字符类-在其他形式中,您会得到一个[[:word:]字符类,然后是literal &&],这会使(?=W)断言失败。为了使Ruby失败,它&&被用来与POSIX类相交,而在PCRE中&&则没有特殊含义。

ary(Javascript)

Ho(?=a)\ar

无论出于何种原因,JavaScript都是唯一\a的文字形式a,而其他形式则与响铃字符(ASCII 7)匹配。

微风(Python)

Bre(?=ez)[]e]\z

在Python和Javascript中,\z是字面量z-在其他形式上,它等效于$字符串锚点的结尾。为了使Javascript失败,我们使用char类[]e],该类是一个空的char类,[]然后e]是Javascript中的文字,而[]e]在Python中是一个两个字符类。

Dapper(.NET)

(?=Da)[D-[E]]apper

在中.NET[D-[E]]是集合差异,[E]从中删除集合[D]。在PCRE,Javascript和Python中,我们有一个类,[D-[E]然后是一个literal ]。Ruby有点不同,但是由于某种原因,它解析为[D-[E]]仅匹配的类E,而我还没有弄清楚为什么...

前卫(Ruby)

E(?=dg)[[d]]g

Ruby允许在char类内部使用char类,因此[[d]]实际上等效于[d]或just d。在其他方面,我们还有[[d]一个字面意思]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.