您的任务是编写没有字符串可以匹配的最短有效正则表达式,包括空字符串。
提交内容必须采用以下格式(“文字符号”):
/pattern/optional-flags
最短的正则表达式获胜。正则表达式的大小以字符为单位。(包括斜杠和标志)
请说明您的正则表达式如何工作(如果不简单的话)
谢谢,玩得开心!
您的任务是编写没有字符串可以匹配的最短有效正则表达式,包括空字符串。
提交内容必须采用以下格式(“文字符号”):
/pattern/optional-flags
最短的正则表达式获胜。正则表达式的大小以字符为单位。(包括斜杠和标志)
请说明您的正则表达式如何工作(如果不简单的话)
谢谢,玩得开心!
Answers:
跟随primo和Peter Taylor的回答,以及来自的提示man perlre
:
/(?!)/
此与Perl兼容的正则表达式与一个空字符串匹配,该字符串后不跟另一个空字符串。
/x\by/
,但是,如果我实际上不得不使用这样的正则表达式-出于某种原因-那么这个答案也是最清晰的答案)
/(*FAIL)/
可能更清晰。(并man perlre
通过提及我的实际上在内部扩展来实际上放弃了它。)
/(*FAIL)/
虽然不那么便携。而且即使在Perl中,我也认为它比负面的预测更为模糊。
-Mre=debug
)表示(?!)
已(*FAIL)
通过Perl regex优化器进行了优化(OPFAIL
根据-Mre=debug
)。另外,我认为我没有(*FAIL)
在Perl 5(和Perl 6,被称为<!>
)之外看到过。
/$a/
在字符串末尾搜索“ a”。
要么
/a^/
在字符串开头之前搜索a。
^
与$
在“非法”的位置正好使它们被当作普通字符处理。你的第一个例子字面匹配$a
的sed
,可能其他程序。
5个字符
/$.^/
/$^/
将匹配一个空字符串,而在两者之间要求一个字符则不会。
$.
为当前行号变量。可能为空,在这种情况下为/^/
。
^
和$
'$^'
使用grep 尝试了该模式,但不幸的是它与字符串匹配'$^'
。Smartass grep。
我认为我制作的这个正则表达式可以工作:
/\b\B/
它与不是单词边界(\b
)的单词边界()匹配\B
。这是什么提示?我真的需要向您解释一下吗?
(仅限ECMAScript风格)
/[]/
在其他的口味,这不是一个有效的字符类(]
将被视为一个字符中的类,所以表达式是无效的,因为类是永远不会关闭),但ECMAScript标准接受空字符类。由于它是一个类,因此必须匹配一个字符(因此,空字符串不匹配),但是由于不包括单个字符,因此任何实际字符都不会匹配。
/[]{0}/
。(注:尽管我自己的回答部分看起来像您的回答,但我写完我的答案后实际上还是阅读了您的回答。)
/[]/.test("")
。它返回false。一个字符类即使它不包含字符也永远不能匹配一个空字符串(我想像它们的实现方式是“如果字符串中的下一个字符是列出的那些字符之一,则匹配;否则为ELSE失败”)。/[]{0}/
是合法的(在ECMAScript中),并且确实匹配空字符串...但是,我不确定这与我的答案有何关系。
/b++b/
所有格量词会寻找尽可能多的b,然后再寻找1。6个字符,但对称点?
0
不适用于PERL。"0"=~0
是真的...
\0
ITYM?是的,大多数perlre(1)和PCRE实现不使用C字符串,而是使用大小限制的缓冲区,这种技巧在其中不起作用,但是大多数POSIX RE实现在C字符串上起作用。
/^.^/
匹配以字符串开头的任何单个字符开头的字符串。
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
和.
不是元字符,需要转义
/.^/
与GNU grep 2.5.1和egrep一起使用。
/.^/
= 4个字符。
//
?这些并不是到处都需要的;-)
/
计数,请参阅原始问题(“包括斜杠和标志”)和OP的条目。
/<!>/
Sorta规则滥用(因为Perl 6 regexes不同,并且在设计上与stardard regexes不兼容),但我不在乎。<!>
规则会通知Perl 6正则表达式不匹配。
在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
6个字符
(或4个,取决于您的外观)
/{,0}/
这是一个5个字符的正则表达式。
/[]+/
它与一个空组匹配1次或更多次。
编辑:
删除了我对其他口味的回答:
/.{-1}/
{}中不是数字的任何内容都将与文本匹配。
这将匹配“。{-1}”
/$^/
事情在开始之前就结束了...