2012-01-05 8 views
6

感謝をエスケープされている必要があります。引用符がすでに文字列でエスケープされていることを確認する必要があります。そうしないと、一致が失敗します。 (質問のこの種のほとんどの検索結果は、あなたが引用符をエスケープする必要があるか、引用符をエスケープする方法を言うだけのページです。)正規表現:私はこの正規表現の質問には右の検索用語を取得しようと恐ろしい時間を持っていた</p> <p>、引用符を文字列で検索するための

有効:

This is valid 
This \"is Valid 
This is al\"so Valid\" 

無効:

This i"s invalid 
This i"s inv"alid 

唯一のもの私はこれまでのところ見つけました

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

これはfollの最初の部分と一致するようですおかげで、何も再びエスケープ引用

This is a \"test 

た後、これは失敗するはずです:

This is a \"test of " the emergency broadcast system 

感謝を任意の助けのために、私はこれがさえ可能であると思います。

+1

あなたはどのような言語を使用していますか? –

+0

+1、REが実際に正しいツールであるように見える興味深い問題。 –

+0

@JosephSilber私は実際には言語を使用していませんが、この正規表現はCMSに使用される正規表現のフィールドの中に入ります。 – Bung

答えて

6

のように見え、これはあなたが望むように動作するように見えるのに役立ちます 希望:エスケープを除くと

string pattern = "^([^\"\\\\]*(\\\\.)?)*$"; 

がであなたを残します:

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

大まかに言えば、次のように変換されます。start-of-string、(multi-chars-excluオプションのバックスラッシュ(任意のバックスラッシュ))

完全なテキストにマッチさせるのは、開始文字列と終了文字列マーカーです。

+0

これが一つの場合を除いて、私のためによく働いている:これは有効な「\されて、私はそれが私が「かなりそうだといえ信じる \ – Bung

+2

はい、文字列がエスケープされた文字をサポートしている場合は、最後に単一のバックスラッシュの場合に失敗するように設計されています。バックスラッシュ、単一のバックスラッシュを有効にすることはできません。 – adelphus

+0

ああ、完璧な意味があります。 – Bung

1

バックスラッシュと引用符、またはバックスラッシュと次の文字以外のすべてを取る必要があります。

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

この方法では、この失敗します。

ab\\"c 

これは成功します:

ab\\\"c 

これは成功します:

ab\"c 
2

は言語にあなたを知ってはいけません私はこの方法でそれをやったでしょう: が

This is a \"test 

に失敗しますバックスラッシュなしで見積もりをマッチする正規表現を、作り、例えば

This is a \"test of " the emergency broadcast system 

に成功しました。この1:

.*(?<!\\)".* 

と結果に負の式を使用します。これはJavaであなた

私のテストは、C#では

String pat = ".*(?<!\\\\)\".*"; 
    String s = "This is a \\\"test"; 
    System.out.println(!s.matches(pat)); 
    s = "This is a \\\"test of \" the emergency broadcast system"; 
    System.out.println(!s.matches(pat)); 
2

ネガティブなビヘイビハインドを使用します。

(?<!\\)" 

この正規表現は、単一のスラッシュが先行していないすべての引用符と一致します。

この正規表現をサンプル文字列に対して実行し、1つ以上の一致が見つかった場合、その文字列は無効です。あなたが探している

1

正規表現は次のとおりです。

/^(?:[^"]*(?:(?<=\\\)"|))*$/ 

説明:最初の"が発見されたか、入力の終わりに達するまで[^"]*が入力と一致します。 "が見つかった場合は、常にの前に/と表示されている(?<=\\\)"見てください。上記のシナリオはです。入力が終了するまで再帰的にが繰り返されます。

TESTING:テストに次のPHPコードを考えてみましょう:

$arr=array('This is valid', 
'This \"is Valid', 
'This is al\"so Valid\"', 
'This i"s invalid', 
'This i"s inv"alid', 
'This is a \"test', 
'This is a \"test of " the emergency broadcast system - invalid'); 
foreach ($arr as $a) { 
    echo "$a => "; 
    if (preg_match('/^(?:[^"]*(?:(?<=\\\)"|))*$/', $a, $m)) 
     echo "matched [$m[0]]\n"; 
    else 
     echo "didn't match\n"; 
} 

OUTPUT:

This is valid => matched [This is valid] 
This \"is Valid => matched [This \"is Valid] 
This is al\"so Valid\" => matched [This is al\"so Valid\"] 
This i"s invalid => didn't match 
This i"s inv"alid => didn't match 
This is a \"test => matched [This is a \"test] 
This is a \"test of " the emergency broadcast system - invalid => didn't match 
+0

実行中のこのコードを参照してください:http://ideone.com/gUyPe – anubhava

関連する問題