あなたの使命は、文字列が一致しない、空の文字列を含む最短の有効な正規表現を書くことです。
提出物は次の形式である必要があります(「リテラル表記」):
/pattern/optional-flags
最短の正規表現が勝ちます。正規表現のサイズは文字でカウントされます。(スラッシュとフラグを含む)
正規表現の仕組みを説明してください(簡単でない場合)
ありがとう、そして楽しんでください!
あなたの使命は、文字列が一致しない、空の文字列を含む最短の有効な正規表現を書くことです。
提出物は次の形式である必要があります(「リテラル表記」):
/pattern/optional-flags
最短の正規表現が勝ちます。正規表現のサイズは文字でカウントされます。(スラッシュとフラグを含む)
正規表現の仕組みを説明してください(簡単でない場合)
ありがとう、そして楽しんでください!
回答:
primoとPeter Taylorの回答と、次のヒントを参照してman perlre
ください。
/(?!)/
このperl互換の正規表現は、空の文字列に一致しますが、その後に別の空の文字列が続きません。
/x\by/
とにかく、実際にこのような正規表現を使用する必要がある場合-何らかの理由で-この回答も最も明確なものです)
/(*FAIL)/
ただし、primoの方がおそらくより明確です。(そして、実際にman perlre
私のものが彼の内部に拡大することを言及することでそれを
/(*FAIL)/
しかし、ポータブルではありません。そして、Perlでさえ、ネガティブな先読みよりもあいまいな機能だと思います。
-Mre=debug
)は、Perl正規表現オプティマイザー(によると)に最適(?!)
化さ(*FAIL)
れていると述べています。また、Perl 5(およびPerl 6と呼ばれる)以外では見たことがないと思います。OPFAIL
-Mre=debug
(*FAIL)
<!>
/\w\b\w/
\b
「単語」文字(\w
-の1つ)に囲まれた単語境界([_a-zA-Z0-9]
)。単語の境界の前後の文字の1つは「単語」以外の文字でなければならないため、一致しません。
ちなみに、これは不一致の式に似ています
/\W\b\W/
ここで、\W
「単語」以外の文字を意味します。
/
カウントされるため、これは競合のルールに従って8文字です。たとえば、OPのエントリを参照してください。しかし、それは素晴らしいエントリーです!
/$a/
文字列の末尾の後に「a」を検索します。
または
/a^/
文字列の先頭の前を検索します。
^
と$
、それらは通常の文字として扱われます。あなたの最初の例では、リテラル一致する$a
でsed
、おそらく他のプログラムを。
echo 'a^b' | grep 'a^b'
対echo 'a^b' | grep -E 'a^b'
。9.4.9 ERE Expression Anchoringを
5文字
/$.^/
/$^/
空の文字列と一致しますが、間に文字が必要な場合は一致しません。
$.
は現在の行番号変数として解釈するかもしれないと思います。空の場合があります/^/
。その場合、これはになります。
^
と$
'$^'
grepでパターンを試しましたが、残念ながらstringと一致しました'$^'
。Smartass grep。
(ECMAScriptフレーバーのみ)
/[]/
他のフレーバーでは、これは有効な文字クラスではありません(クラス内の]
文字と見なされるため、クラスが閉じられないため式は無効です)が、ECMAScript標準は空の文字クラスを受け入れます。それはクラスであるので、それが持っている(これは空の文字列が一致しない)の文字に一致するようにではなく、単一の文字が含まれているため、実際の文字は、どちらかと一致しません。
/[]{0}/
。(追伸:私自身の答えは部分的にあなたのものに見えますが、実際に書いた後にあなたのものを読みます。)
/[]/.test("")
。falseを返します。文字クラスは、文字が含まれていなくても、空の文字列に一致することはありません(「文字列の次の文字がリストされている文字の1つである場合、一致します; ELSE失敗」のように実装されていると思います)。/[]{0}/
(ECMAScriptで)正当であり、空の文字列と一致します...しかし、それが私の答えにどのように関連するのかわかりません。
/b++b/
所有量指定子は、できるだけ多くのbを探してから、さらに1を探します。6文字だが対称性のポイント?
/^.^/
文字列が始まる前の任意の1文字で始まる文字列に一致します。
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
と.
エスケープする必要がメタ文字ではない文字通り、ある
/.^/
GNU grep 2.5.1およびegrepで動作します。
/.^/
= 4文字。
//
ですか?それらはどこでも必要ではありません;-)
/
カウントされます。元の質問(「スラッシュとフラグを含む」)およびOPのエントリを参照してください。
/<!>/
ソート規則の乱用(Perl 6の正規表現は異なり、設計上標準の正規表現と互換性がないため)が、私は気にしません。<!>
規則は、正規表現が一致しないことを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}」に一致します
/$^/
それが始まる前に終わるもの...