交叉匹配的正则表达式


21

您的任务是编写两个正则表达式,每个正则表达式都与另一个正则表达式匹配,但自身不匹配。

两个正则表达式都应具有以下形式:

/pattern/optional-flags

这也是它们应该匹配的形式。

最短的解决方案获胜。解决方案长度计算为两个正则表达式(包括斜杠和标志)中字符的总和。

可以使用您选择的regex语法标准,或者指定编程语言(如果有区别)。

玩得开心!


正则表达式是否还必须匹配其他正则表达式的斜杠和标志?
ProgramFOX 2014年

@ProgramFOX是的,我添加了一行使其清楚。
GOTO

您可以定义匹配吗?即正则表达式/a/匹配abc吗?
戴帽子的家伙

2
@TheGuywithTheHat好吧,我想是的,除非您选择一种施加某些限制的语言,例如需要匹配整个字符串。这可以解决您的问题吗?
GOTO

1
需要明确的是:我假设不允许使用不同的分隔符(例如PHP PCRE允许的)?(即不提交/^%/%^/%
彼得·泰勒

Answers:


7

带A修饰符的PRCE:9个字符

/A$/
/.A/A

尽管这是Doorknob /modifier$/答案的一种变体,但我认为这项创新将其限定为单独的答案,而不是对他的评论:修饰符具有双重职责。它锚定了,而不是仅仅在那里供其他正则表达式匹配。

第一个正则表达式匹配以文字结尾的任何字符串A。第二个正则表达式A使用anchor-to-start标志匹配第二个字符为文字的任何字符串。

在线演示


3
要克服这个问题,只需要四个非定界符,并且由于//匹配任何东西,这意味着每个正则表达式最多可以具有三个非定界符。使用PHP PCRE,在该约束中有73339个非自匹配正则表达式,并且对长度小于10(对为32Mpairs而不是5.7Gpairs的对,因为它们中的大多数都是5个字符,包括定界符)的长度进行详尽的检查此解决方案,没有其他选择。因此,我声称它对于该特定的正则表达式引擎而言是最佳的。
彼得·泰勒

18

4 + 6 = 10分

第一个正则表达式:

/i$/

第二个正则表达式:

/^.i/i

万岁滥用国旗!:-P

第一个匹配以结尾的任何内容i(因此,任何带有该i标志的正则表达式)。

第二个匹配任何具有第二个字符的字符i

备用版本:/i$/g/g$/i


3
另一个变体是/x.$//^.x/对于一束x的
shiona

或者/i$//\/$/i
彼得·泰勒

或者/i$//i\$/i
彼得·泰勒

6

JavaScript正则表达式,得分:18

第一个正则表达式:

/^[^a]+$/

第二个正则表达式:

/^[^b]+$/

JavaScript测试:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

在线测试:http//jsfiddle.net/99Sx6/


5

Ruby正则表达式,15

常用表达:

/.{9}/
/^.{06}$/

只是数字符...

在线版

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

第一个正则表达式:

/i$/

第二个正则表达式:

/\/$/i

i$匹配以结尾的东西,i第二个。/$匹配/以第一个结尾的东西。


2
我对Doorknob的回答发表了评论。
彼得·泰勒

@PeterTaylor直到现在才注意到评论。这些都是独立的发现。
贾斯汀

是的,我也独立发现了shiona的版本。
彼得·泰勒

3

5 + 5 = 10

正则表达式1:

/0.$/

正则表达式2:

/^.0/

0可以将两个正则表达式中的s替换为任何非元字符,并且该正则表达式仍然有效。

0.$匹配任何其倒数第二个字符是0,和^.0任何匹配其第二个字符0


2
第一对不是有效的正则表达式:您需要对/es 进行转义。另一种选择是对Doorknob的答案发表评论。
彼得·泰勒

2

JavaScript正则表达式,得分:13

第一个正则表达式:

/\d/

第二个正则表达式:

/^[^0]+$/

说明:第一个正则表达式匹配包含数字的所有内容,第二个正则表达式匹配不包含的所有内容0

JavaScript测试:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

在线测试:http//jsfiddle.net/5VYjC/1/



2

得分:5 + 5 = 10

花了我半个小时的时间来弄清楚,但我真的很高兴自己做到了:)

第一个是: /j.$/

第二个是: /^.j/

第一个与j从右开始的第二个位置中发生的匹配。第二个匹配项j从左开始在第二个位置发生。

我还没有测试过,但是我认为这些RegEx确实是多功能的,因为j可以用任何\w字符(或更多字符)代替,并且仍然可以正常工作。

PS(希望)可以使用任何语言。但是,如果不能使用,请在下面的评论中告知:)

测试


我现在发现@Quiccunx已经发布了与我相同的版本。对Quiccunx感到非常抱歉,如果可以,请删除答案。
Gaurang Tandon 2014年

1

使用修饰符x的PCRE:11个字符

/\s/
/ s.$/x

第一个匹配任何带有空格字符的字符串,但不包含空格。第二个包含空格,但是由于x修饰符而被忽略;它匹配倒数第二个字符为的任何字符串s

PCRE和其他使用字符类的引擎:11个字符

/\w+w/
/\Ww/

第一个匹配任何带有“单词”字符(字母,数字,下划线)的字符串,后跟一个文字w;第二个匹配任何带有非单词字符的字符串,后跟一个literal w

使用字符类和单词边界锚点的PCRE和其他引擎:11个字符

/\w\w/
/\bw/

第一个匹配任何带有两个连续的“单词”字符的字符串;第二个任意字符串,带有非单词字符或字符串开头,后跟文字w


-1

ECMAScript(11个字节):

/^\1?d/
/\d/

其他REGEXP引擎(14字节):

/^\\\\1?d/
/\d/

第一个匹配\ d [..]或\ 1d [..]。

第二个匹配带数字的任何字符串。

编辑:

最初,此答案被发布为与所有引擎兼容,但事实证明这是错误的。

引用捕获组时出现问题(例如,在php中)。


许多正则表达式引擎采用正则表达式时都没有出现斜杠,但是在要求对它们进行计数时,问题很明显。
彼得·泰勒

我不认为这是答案。让我为此添加注释。
Ismael Miguel 2014年

1
@PeterTaylor我添加了笔记。Apache版本在那里是因为。
Ismael Miguel 2014年

继续:第一个解析在哪些引擎中不被\1解释为反向引用?
彼得·泰勒

取决于您使用它的方式。例如,在php中,如果放进去"/^\1?d/"会遇到麻烦,但是如果放进去就可以了'/^\1?d/'。解释代码时,引号有很大的不同。
Ismael Miguel
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.