最短的不可匹配的正则表达式


59

您的任务是编写没有字符串可以匹配的最短有效正则表达式,包括空字符串。

提交内容必须采用以下格式(“文字符号”):

/pattern/optional-flags

最短的正则表达式获胜。正则表达式的大小以字符为单位。(包括斜杠和标志)

请说明您的正则表达式如何工作(如果不简单的话)

谢谢,玩得开心!


这启发了我一个问题。不过我要等几天。不想同时激活两个正则表达式问题
Cruncher 2014年

13
“有效”根据哪个执行?我刚刚发现了一个有趣的一个Perl是好有(按照该是有效的唯一RE语法我能找到,但grep和Python的re模块拒绝。
乔什-卡斯威尔

1
是的,正则表达式是哪一种方言?有很多很多不同的。
hippietrail 2014年

1
但是总统的名字呢? xkcd.com/1313
卡尔·

@CarlWitthoft您需要成为一个程序才能参加该比赛:codegolf.stackexchange.com/q/17718/2180
展位

Answers:


53

6个字符

跟随primo和Peter Taylor的回答,以及来自的提示man perlre

/(?!)/

此与Perl兼容的正则表达式与一个空字符串匹配,该字符串后不跟另一个空字符串。


+1-这可能是可移植性最短的答案(以及/x\by/,但是,如果我实际上不得不使用这样的正则表达式-出于某种原因-那么这个答案也是最清晰的答案)
Martin Ender 2014年

@ m.buettner:谢谢。primo的/(*FAIL)/可能更清晰。(并man perlre通过提及我的实际上在内部扩展来实际上放弃了它。)
Nate Eldredge 2014年

/(*FAIL)/虽然不那么便携。而且即使在Perl中,我也认为它比负面的预测更为模糊。
Martin Ender 2014年

3
如今,您几乎可以在所有流行的风格(Perl启发)中找到环顾四周,而在Perl中,我从未见过这些控制动词。
Martin Ender 2014年

1
实际上,Perl文档(和-Mre=debug)表示(?!)(*FAIL)通过Perl regex优化器进行了优化(OPFAIL根据-Mre=debug)。另外,我认为我没有(*FAIL)在Perl 5(和Per​​l 6,被称为<!>)之外看到过。
Konrad Borowski14年

39

8个字符

/(?=a)b/

我们需要一个包含既是a和的字符的字符串b,这显然是不可能的。


19
/(?!x)x/看起来更加不可能;-)
霍华德

@PeterTaylor在哪里?
o0'。

@Lohoris,在哪里?
彼得·泰勒

@PeterTaylor他把您谈论的那些荒唐规则放在哪里了,我找不到它们。
o0'。

7
伙计们,为我选择的计数而感到抱歉,我认为包含斜线会更简单,因为它们后面可能会出现可选标记。
xem 2014年

31

5个字符

与每个虐待$^...的人不同,这实际上在Perl中有效:

/V\A/

\A 匹配字符串的开头。


它也适用^
Tomas


28

8个字符

/\w\b\w/

\b由“单词”字符(\w-之一)包围的单词边界([_a-zA-Z0-9])。这是无法匹配的,因为单词边界之前或之后的字符之一必须是非“ word”字符。

顺便说一句:这类似于不可匹配的表达式

/\W\b\W/

其中\W表示非单词字符。


根据比赛规则,这是8个字符,因为包装的斜杠/算在内。例如,请参阅OP的条目。不过,这是一个很棒的入门!
乔什·卡斯韦尔

考虑到一些较短条目的实现相关问题,它也可能是赢家(或与Peter Taylor的条目并列)!
2014年

十分优雅!我以为一定有这样的东西!
Tomas

22

4个字符

/$a/

在字符串末尾搜索“ a”。

要么

/a^/

在字符串开头之前搜索a。


20
如果您知道有两个字符的解决方案,为什么还要发布问题?
彼得·泰勒

3
@Howard:匹配一个空字符串:jsfiddle.net/RjLxJ
ProgramFOX

10
为什么在提供无与伦比的解决方案后我总是会发现这些问题:(
Cruncher 2014年

43
-1:把^$在“非法”的位置正好使它们被当作普通字符处理。你的第一个例子字面匹配$ased,可能其他程序。
本杰克逊

2
@Ben Jackson,对于POSIX ERE并非如此。尝试echo 'a^b' | grep 'a^b'echo 'a^b' | grep -E 'a^b'

21

5个字符

/$.^/

/$^/ 将匹配一个空字符串,而在两者之间要求一个字符则不会。


6
不幸的"$a^"是,这'a'与Perl(甚至可能是sed)匹配(或代替)。不过还是不错的!
Josh Caswell 2014年

@JoshCaswell:我想perl可能会解释$.为当前行号变量。可能为空,在这种情况下为/^/
MvG 2014年

介于“之间”的字符仅表示一个字符的字符串。
jwg 2014年

3
@jwg注意到交换^$
mniip

'$^'使用grep 尝试了该模式,但不幸的是它与字符串匹配'$^'。Smartass grep。
joeytwiddle 2014年

19

9个字符

我不确定,但是/[^\S\s]/应该是不可比的,因为它表示的不是任何字符,而是至少其中之一。


您不需要+
彼得·泰勒

10
/ [^ \ S \ s] / = 9个字符
xem,2014年

19

6个字符

我认为我制作的这个正则表达式可以工作:

/\b\B/

它与不是单词边界(\b)的单词边界()匹配\B。这是什么提示?我真的需要向您解释一下吗?


这不是在搜索单词边界,然后是非单词边界吗?
grexter89 2014年

1
@ grexter89是的,但是它们之间不能有任何字符。即边界和无边界必须占据相同的空间。
帽子的家伙

2
我喜欢这一个。接得好。
primo 2014年

18

4个字符

(仅限ECMAScript风格)

/[]/

在其他的口味,这不是一个有效的字符类(]将被视为一个字符的类,所以表达式是无效的,因为类是永远不会关闭),但ECMAScript标准接受空字符类。由于它是一个类,因此必须匹配一个字符(因此,空字符串不匹配),但是由于不包括单个字符,因此任何实际字符都不会匹配。


即使您说必须匹配一个字符,这也不会匹配空字符串吗?还是您认为这是非法的:/[]{0}/。(注:尽管我自己的回答部分看起来像您的回答,但我写完我的答案后实际上还是阅读了您的回答。)
nl-x

@ nl-x将此粘贴到浏览器的控制台中:/[]/.test("")。它返回false。一个字符类即使它不包含字符也永远不能匹配一个空字符串(我想像它们的实现方式是“如果字符串中的下一个字符是列出的那些字符之一,则匹配;否则为ELSE失败”)。/[]{0}/是合法的(在ECMAScript中),并且确实匹配空字符串...但是,我不确定这与我的答案有何关系。
Martin Ender 2014年

在Ruby 2.0中失败
Nakilon 2014年

@Nakilon当然可以。Ruby没有实现ECMAScript风格。
Martin Ender 2014年

15

6个字符

/b++b/

所有格量词会寻找尽可能多的b,然后再寻找1。6个字符,但对称点?


嗯...我刚学了一个新功能。显然,我的正则表达式技能已经过时了。谢谢,并+1。
Ilmari Karonen 2014年

8

6个字符

/(\1)/

不是赢家,但我认为这很有趣。grep和Python都在此基础上bar之以鼻,但Perl对此还可以。

似乎非常依赖于实现(鉴于其怪异性,这不足为奇)。Bob在下面报告说,它与JavaScript的正则表达式引擎中的任何内容都匹配。


.NET的正则表达式引擎似乎接受了它。
鲍勃

而且无论JS输入什么,它总是匹配(一个空字符串)
Bob

8

也许有点作弊,但是…

\0

… 在几乎所有(即使不是全部)实现中,在POSIX正则表达式中都是无法比拟的。基本RE和扩展RE,甚至。

POSIX RE不需要PCRE拥有的那些讨厌的斜杠和标记。


+1好!不幸的是,鞋底0不适用于PERL。"0"=~0是真的...
Tomas

唯一的\0ITYM?是的,大多数perlre(1)和PCRE实现不使用C字符串,而是使用大小限制的缓冲区,这种技巧在其中不起作用,但是大多数POSIX RE实现在C字符串上起作用。
mirabilos 2014年

5

5个字符

/^.^/

匹配以字符串开头的任何单个字符开头的字符串。


6
另外,字符串匹配".^"
布思

@boothby:匹配哪种语言?在Python中没有。re.findall(r'^.^', '.^', re.DEBUG)
P̲̳x͓L̳

8
+1使用漫画运算符(见stackoverflow.com/questions/3618340/...
原型

@boothby ^.不是元字符,需要转义
P̲̳x͓L̳ 2014年

1
在Perl中被破坏了。这个问题确实应该为语言设定一些基本规则。
展位

5

4个字符:

/.^/

与GNU grep 2.5.1和egrep一起使用。


/.^/= 4个字符。
Alexey Popkov

为什么需要//?这些并不是到处都需要的;-)
RSFalcon7

包装的斜杠/计数,请参阅原始问题(“包括斜杠和标志”)和OP的条目
Alexey Popkov

对!我想念了:(
RSFalcon7 2014年

否,原因与以下原因相同:实际上,“ ^”仅在模式开头时才是特殊的。不需要转义任何其他后面的“ ^”,因此此答案是错误的。
mirabilos 2014年


4

6个字节

/(*F)/

(*FAIL)Perl兼容的regex引擎支持的缩写。感谢@HamZa指出这一点。

9字节

/(*FAIL)/

应该与所有支持动词的正则表达式引擎一起使用。我不认为这确实需要进一步打高尔夫球。


1
这是如何运作的?
展位,

@boothby (*FAIL)是一个总是失败的动词。
2014年

@primo,您可能只使用/(*F)/:)
HamZa 2014年


3

4个带斜线的字符2不带

在TXR语言的正则表达式引擎中,空字符类不[]匹配任何字符,因此不匹配任何字符串。它的行为方式是因为字符类需要一个字符匹配,并且当它为空时,它指定没有字符可以满足它。

另一种方法是/.*/使用补码运算符反转“所有包含空字符串的集合”的正则表达式:/~.*/。该集合的补码根本不包含任何字符串,因此无法匹配任何内容。

手册页中都记录了这些内容:

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

斜杠本身不是正则表达式语法的一部分;它们只是标点符号,以S表达式符号分隔正则表达式。见证人:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex

感谢您的回答,并再次为斜杠计数感到抱歉。我认为,如果人们使用标志,将它们包括在内会更容易。
xem 2014年


1

这是一个5个字符的正则表达式。

/[]+/

它与一个空组匹配1次或更多次。

编辑:

删除了我对其他口味的回答:

/.{-1}/

{}中不是数字的任何内容都将与文本匹配。

这将匹配“。{-1}”


请注意,这仅适用于ECMAScript风格。在其他大多数(不是全部)中,它不是有效的表达式。
Martin Ender 2014年

无效吗?
Wasi 2014年

@Wasi不符合ECMAScript风格-Martin
Ender

0

5个字符

希望这听起来不愚蠢: /[]+/


不。不是有效的正则表达式。
帽子的家伙

@RyanCarlson这是合法的……至少在Ecmascript中。
nl-x

-1
/$^/

事情在开始之前就结束了...


7
匹配空字符串(无论如何,在某些RE实现中)。
乔什·卡斯韦尔

1
您的实现已被破坏:)
simon 2014年


7
更重要的是,正如本杰克逊Ben Jackson)所指出的那样,在Perl中不匹配的地方"",它确实匹配了包含这两个文字字符的字符串:"$^"
乔什·卡斯韦尔

+1我只想发布相同的内容!@Josh,它确实可以在PERL中工作,并且不匹配空字符串!Ben的评论被打断了,我回答了。
Tomas
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.