RegEx-golf:文字列のすべてのコンテンツに一致


10

あなたの仕事は、文字列内のすべてに一致するRegExを記述することです。

文字列は、エスケープされていない2つので囲まれている(ただし含まれていない)すべてのものとして定義されます"

Aが"でエスケープすることができ\、また再びエスケープすることができ、。

テストケース

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

得点

最短のソリューションが優先されます。

スペック

  • 使用するフレーバーを指定してください。
  • 入力はバランスが取れてい"ます。
  • \string-beginning-delimiterの直前には何もありません。たとえば、処理する必要はありませんabc\"def"

1
あるだろう\文字列の前に?例えばabc\"def"
jimmy23013 2016年

1つのグループの各文字列と一致する必要がありますか?例えば、私が2つの試合を持っている何かを書くことができabc"de"、一つはありd、他方はありますかe
jimmy23013

許されます。
Leaky Nun

空の文字列はありますか?
マーティンエンダー2016年

はい、空の文字列があります。
Leaky Nun 2016年

回答:


3

PCRE、21 20 15 19バイト

(.|^)"\K(\\.|[^"])*

ここで試してください。

これは、開始二重引用符の前の文字(または入力の開始)と一致し、一致をリセットして、二重引用符が別の一致と共有されないようにします。

PCRE、25 23バイト

2バイトをオフにしてくれたMartinBüttnerに感謝します。

(\\.|[^"])*+(?!"(?R)|$)

ここで試してください。

説明

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

所有的量指定子(*+)は、負の先読みが常に文字列全体、または非文字列のセグメント全体の後に始まることを確認したことに注意してください。

4つのケースがあります。

  • 一致は文字列の外側のどこからでも始まります。\\.明確化によると、二重引用符と一致することはありません。文字列を開始する次の二重引用符または入力の終わりの直前でのみ終了できます。どちらの場合も否定先読みは失敗します。
  • 一致は文字列の先頭から始まります。(\\.|[^"])*+完全な文字列と一致します。次の文字は二重引用符である必要があり、入力の終わりにすることはできません。二重引用符の後は文字列の外にあるため、別の一致にすることはできません。したがって、それは否定的な先読みを通過します。
  • マッチは文字列の終わりから始まります。前のケースと同じ方法で空の文字列に一致します。しかし、明確化によるとそれは問題ではありません。
  • マッチは文字列の途中から始まります。一致が重複しないため不可能です。

うまくいくでしょう(\\.|[^"])か?
マーティンエンダー2016年

"以外のすべて一致しMartinBüttner@
バリント

@Bálintは([^\\"]|\\.)、完全なソリューションとしてではなく、の代わりに意味しました。
マーティンエンダー2016年

@MartinBüttnerああ、そうか
バーリント

マーティンの提案は機能するはず\\.です。失敗するのは、後に文字がない場合\(または改行文字ですが、フラグで修正できます)、その場合は否定的な後読みでカバーされるためです。所有的な量指定子はバックトラックを防ぐため、他に調べるケースはありません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2016年

0

JavaScript、24バイト

"([^"\\]*(?:\\.[^"\\]*)*)"

グループ1は文字列の内容です。


これはエスケープされた引用符ではまったく機能しないため、仕様を満たすことができません。
ATaco 2017

ああ、そうです。どのようにそのことについて?
Whothehellisthat

閉じるが葉巻はない、外側"のs と一致させるべきではない
ATaco

ええ、それは私が恐れていたものです。JavaScriptでそれを行う方法はないと思いますか?
Whothehellisthat

サブグループでキャプチャできます
ATaco 2017

0

JavaScript、21 15 13 12バイト

"((\\?.)*?)"

文字列の内容はグループ1にあります。

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.