最短の一致しない正規表現


59

あなたの使命は、文字列が一致しない、空の文字列を含む最短の有効な正規表現を書くことです。

提出物は次の形式である必要があります(「リテラル表記」):

/pattern/optional-flags

最短の正規表現が勝ちます。正規表現のサイズは文字でカウントされます。(スラッシュとフラグを含む)

正規表現の仕組みを説明してください(簡単でない場合)

ありがとう、そして楽しんでください!


これは私からの質問を引き起こしました。でも数日待つつもりです。2つの正規表現の質問を同時にアクティブにしたくない
ランチャー

13
どの実装に従って「有効」ですか?私はPerlは大丈夫です面白いものを見つけました(それはに応じて有効である私は見つけることができる唯一のREの文法が、それはgrepやPythonのreモジュールはお断り致します。
ジョシュ・キャスウェル

1
はい、正規表現どの方言ですか?多くの異なるものがあります。
ヒッピートレイル2014年

1
しかし、大統領の名前はどうですか? xkcd.com/1313
カールウィットフト

@CarlWitthoftあなたはそのコンテストに参加するためのプログラムである必要があります:codegolf.stackexchange.com/q/17718/2180
boothby

回答:


53

6文字

primoとPeter Taylorの回答と、次のヒントを参照してman perlreください。

/(?!)/

このperl互換の正規表現は、空の文字列に一致しますが、その後に別の空の文字列が続きません。


+1-これはおそらく、広く移植可能な最短回答です(/x\by/とにかく、実際にこのような正規表現を使用する必要がある場合-何らかの理由で-この回答も最も明確なものです)
マーティン・エンダー

@ m.buettner:ありがとう。/(*FAIL)/ただし、primoの方がおそらくより明確です。(そして、実際にman perlre私のものが彼の内部に拡大することを言及することでそれを
放棄しました

/(*FAIL)/しかし、ポータブルではありません。そして、Perlでさえ、ネガティブな先読みよりもあいまいな機能だと思います。
マーティンエンダー

3
今日、人気の(Perlに触発された)ほぼすべてのフレーバーで見回すことができますが、これらの制御動詞はPerl以外では見たことがありません。
マーティンエンダー

1
実際、Perlのドキュメント(および-Mre=debug)は、Perl正規表現オプティマイザー(によると)に最適(?!)化さ(*FAIL)れていると述べています。また、Perl 5(およびPerl 6と呼ばれる)以外では見たことがないと思います。OPFAIL-Mre=debug(*FAIL)<!>
コンラッドボロウスキ

39

8文字

/(?=a)b/

我々は両方の文字を含む文字列必要abは明らかに不可能である、と。


19
/(?!x)x/さらに不可能に見える;-)
ハワード

@PeterTaylorどこ?
o0 '。

@Lohoris、どこ?
ピーターテイラー

@PeterTaylorは、あなたが話しているこれらの不条理なルールをどこに置いたのか、見つけられませんでした。
o0 '。

7
皆さん、私が選んだカウントについて申し訳ありませんが、スラッシュの後にオプションのフラグがあるため、スラッシュを含める方が簡単だと思いました。
xem

31

5文字

誰虐待皆とは違って$^...これは実際にはPerlで動作します。

/V\A/

\A 文字列の先頭に一致します。


それも動作し^ます。
トマス


28

8文字

/\w\b\w/

\b「単語」文字(\w-の1つ)に囲まれた単語境界([_a-zA-Z0-9])。単語の境界の前後の文字の1つは「単語」以外の文字でなければならないため、一致しません。

ちなみに、これは不一致の式に似ています

/\W\b\W/

ここで、\W「単語」以外の文字を意味します。


ラッピングスラッシュが/カウントされるため、これは競合のルールに従って8文字です。たとえば、OPのエントリを参照してください。しかし、それは素晴らしいエントリーです!
ジョシュキャスウェル

また、いくつかの短いエントリの実装依存の問題を考えると、勝者になる可能性があります(またはPeter Taylorのエントリと結びついています)。
ジョシュキャスウェル

とてもエレガント!このようなものがあるに違いないと思った!
トマス14

22

4文字

/$a/

文字列の末尾の後に「a」を検索します。

または

/a^/

文字列の先頭の前を検索します。


20
2文字の解決策があることがわかっているのに、なぜ質問を投稿しますか?
ピーターテイラー

3
@Howard:空の文字列に一致:jsfiddle.net/RjLxJ
ProgramFOX

10
無敵のソリューションが提供された後、なぜこれらの問題を常に見つけるのですか:(
Cruncher

43
-1:「不正」位置に置く^$、それらは通常の文字として扱われます。あなたの最初の例では、リテラル一致する$ased、おそらく他のプログラムを。
ベンジャクソン

2
@Ben Jackson、これはPOSIX EREには当てはまりません。試してみてくださいecho 'a^b' | grep 'a^b'echo 'a^b' | grep -E 'a^b'9.4.9 ERE Expression Anchoringを
laindir

21

5文字

/$.^/

/$^/ 空の文字列と一致しますが、間に文字が必要な場合は一致しません。


6
残念ながら、これはPerl(および多分sed)で"$a^"(またはの代わりに一致する)一致します。それでもいいものです!'a'
ジョシュキャスウェル

@JoshCaswell:perl $.は現在の行番号変数として解釈するかもしれないと思います。空の場合があります/^/。その場合、これはになります。
MvG

「間」という文字は、1文字の文字列を意味します。
jwg

3
@jwgスワップ気づく^$
mniip

'$^'grepでパターンを試しましたが、残念ながらstringと一致しました'$^'。Smartass grep。
joeytwiddle

19

9文字

確か/[^\S\s]/ではありませんが、文字ではなく、少なくとも1つの文字を意味するため、一致しないはずです。


あなたは必要ありません +
ピーターテイラー

10
/ [^ \ S \ s] / = 9文字
XEM

19

6文字

私が作ったこの正規表現はうまくいくと思います:

/\b\B/

単語の境界(\b)ではない単語の境界()に一致し\Bます。どちらが重要なのか、これを本当に説明しなければなりませんか?


これは、単語境界の後に非単語境界が続くものを検索しませんか?
grexter89

1
@ grexter89はい。ただし、間に文字を含めることはできません。すなわち、境界と非境界は同じスペースを占有する必要があります。
帽子を持つ男

2
私はこれが好きです。良いキャッチ。
primo

18

4文字

(ECMAScriptフレーバーのみ)

/[]/

他のフレーバーでは、これは有効な文字クラスではありません(クラス]文字と見なされるため、クラスが閉じられないため式は無効です)が、ECMAScript標準は空の文字クラスを受け入れます。それはクラスであるので、それが持っている(これは空の文字列が一致しない)の文字に一致するようにではなく、単一の文字が含まれているため、実際の文字は、どちらかと一致しません。


文字と一致する必要があると言っても、これは空の文字列と一致しませんか?それとも、これは違法であると思います:/[]{0}/。(追伸:私自身の答えは部分的にあなたのものに見えますが、実際に書いた後にあなたのものを読みます。)
nl-x

@ nl-xをブラウザのコンソールに貼り付けます:/[]/.test("")。falseを返します。文字クラスは、文字が含まれていなくても、空の文字列に一致することはありません(「文字列の次の文字がリストされている文字の1つである場合、一致します; ELSE失敗」のように実装されていると思います)。/[]{0}/(ECMAScriptで)正当であり、空の文字列と一致します...しかし、それが私の答えにどのように関連するのかわかりません。
マーティンエンダー

Ruby 2.0で失敗する
ナキロン

@Nakilonはもちろんそうです。RubyはECMAScriptフレーバーを実装していません。
マーティンエンダー

15

6文字

/b++b/

所有量指定子は、できるだけ多くのbを探してから、さらに1を探します。6文字だが対称性のポイント?


ええと...新しい機能を学びました。どうやら、私の正規表現スキルは古くなっています。ありがとう、+ 1。
イルマリカロネン14

8

6文字

/(\1)/

勝者ではありませんが、楽しいと思いました。grepとPythonはどちらもこれに反しますが、Perlはそれで問題ないようです。

実装に非常に依存しているようです(その奇妙さを考えると、これはほとんど驚くことではありません)。ボブは、JavaScriptの正規表現エンジンのすべてに一致すると報告しています。


.NETの正規表現エンジンはそれを受け入れているようです。
ボブ

そして、JSの入力に関係なく、常に一致します(空の文字列)
ボブ

8

ちょっとした不正行為かもしれませんが…

\0

POSIX正規表現では、すべてではありませんが、ほぼすべての実装で比較できません。BASIC REおよびEXTENDED RE、偶数。

また、POSIX REでは、PCREにある厄介なスラッシュやフラグは必要ありません。


+1いいね!! 残念ながら、0PERL ではソールは機能しません。"0"=~0本当です...
トマス

唯一の\0ITYM?はい、ほとんどのperlre(1)およびPCRE実装はC文字列を使用しませんが、サイズが制限されたバッファーを使用します。
ミラビロス14

5

5文字

/^.^/

文字列が始まる前の任意の1文字で始まる文字列に一致します。


6
また、文字列にマッチする".^"
boothby

@boothby:どの言語で一致しますか?Pythonではそうではありません。re.findall(r'^.^', '.^', re.DEBUG)
PXL

8
マンガ演算子を使用するための+1(stackoverflow.com/questions/3618340/…を参照)
プロトタイプ

@boothby ^.エスケープする必要がメタ文字ではない文字通り、ある
PXL

1
Perlで壊れています。この質問は本当に言語に関するいくつかの基本的なルールを設定する必要がありました。
ブースビー

5

4文字:

/.^/

GNU grep 2.5.1およびegrepで動作します。


/.^/= 4文字。
アレクセイ・ポプコフ

なぜあなたは必要//ですか?それらはどこでも必要ではありません;-)
RSFalcon7

ラッピングスラッシュは/カウントされます。元の質問(「スラッシュとフラグを含む」)およびOPのエントリを参照してください。
アレクセイ・ポプコフ

右!読み逃し:(
RSFalcon7

いいえ、以下と同じ理由で:実際には、「^」はパターンの先頭にある場合にのみ特別です。他の「^」はエスケープする必要がないため、この答えは間違っています。
ミラビロス14

4

Perl 6(5文字)

/<!>/

ソート規則の乱用(Perl 6の正規表現は異なり、設計上標準の正規表現と互換性がないため)が、私は気にしません。<!>規則は、正規表現が一致しないことをPerl 6に通知します。


4

6バイト

/(*F)/

(*FAIL)perl互換の正規表現エンジンでサポートされているの略語。おかげ@HamZaこれを指摘してにします。

9バイト

/(*FAIL)/

動詞をまったくサポートする正規表現エンジンで動作するはずです。これを本当にもっとゴルフする必要があるとは思いません。


1
これはどのように作動しますか?
ブースビー

@boothby (*FAIL)は常に失敗する動詞です。
プリモ

@primoを使用します/(*F)/:)
HamZa


3

スラッシュ2文字なしで4文字

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 14年


1

これは5文字の正規表現です。

/[]+/

空のグループに1回以上一致します。

編集:

他のフレーバーに対する私の答えを削除しました:

/.{-1}/

{}内の数字ではないものはすべてテキストと一致します。

これは「。{-1}」に一致します


これはECMAScriptフレーバーでのみ機能することに注意してください。ほとんどの(すべて?)その他では、有効な式ではありません。
マーティンエンダー

無効ではないですか?
ワシ

ないのECMAScript準拠の味で@Wasi
マーティン・エンダー

0

5文字

これが愚かに聞こえないことを願っています: /[]+/


いや。有効な正規表現ではありません。
帽子の男

@RyanCarlson有効かつ合法です...少なくともEcmascriptでは。
nl-x 14年

-1
/$^/

それが始まる前に終わるもの...


7
空の文字列に一致します(一部のRE実装では、とにかく)。
ジョシュキャスウェル

1
あなたの実装は壊れています:)
サイモン


7
さらに重要なこととして、ベン・ジャクソンが指摘し、それが一致しない場合、Perlで、""それはないこれら二つのリテラル文字を含む文字列にマッチ:"$^"
ジョシュキャスウェル

+1同じものを投稿したかっただけです!@ジョシュ、それはPERLで動作し、空の文字列とは一致しません!ベンのコメントは壊れています、私はそれに答えました。
トマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.