" It's big \"problem "
正規表現を使用して部分文字列を取得するにはどうすればよいですか?
s = ' function(){ return " It\'s big \"problem "; }';
" It's big \"problem "
正規表現を使用して部分文字列を取得するにはどうすればよいですか?
s = ' function(){ return " It\'s big \"problem "; }';
回答:
/"(?:[^"\\]|\\.)*"/
RegexコーチとPCREワークベンチで動作します。
JavaScriptでのテストの例:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
(?:...)
は、パッシブグループまたは非キャプチャグループです。これは、後で後方参照できないことを意味します。
/(["'])(?:[^\1\\]|\\.)*?\1/
var s = ' my \\"new\\" string and \"this should be matched\"';
、このアプローチは予期しない結果につながります。
これは、多くのLinuxディストリビューションで利用可能なnanorc.sampleからのものです。Cスタイル文字列の構文強調表示に使用されます
\"(\\.|[^\"])*\"
var s = ' my \\"new\\" string and \"this should be matched\"';
、このアプローチは予期しない結果につながります。
" \"(\\\\.|[^\\\"])*\" "
ePharaohが提供するように、答えは
/"([^"\\]*(\\.[^"\\]*)*)"/
上記を一重引用符または二重引用符で囲まれた文字列に適用するには、次を使用します。
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
ここで提供されるソリューションのほとんどは、代替の繰り返しパス、つまり(A | B)*を使用します。
一部のパターンコンパイラは再帰を使用してこれを実装しているため、大きな入力でスタックオーバーフローが発生する可能性があります。
たとえばJava:http : //bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
このようなもの:
"(?:[^"\\]*(?:\\.)?)*"
、またはGuy Bedfordによって提供されるものは、ほとんどのスタックオーバーフローを回避する解析ステップの量を削減します。
/(["\']).*?(?<!\\)(\\\\)*\1/is
引用符で囲まれた文字列で動作するはずです
これはPCREで完璧に動作し、StackOverflowに該当しません。
"(.*?[^\\])??((\\\\)+)?+"
説明:
"
ます。.*?
{レイジーマッチ}; 非エスケープ文字で終わる[^\\]
;(.*?[^\\])??
"
)で終わりますが、その前に偶数個のエスケープ記号ペアを付けることができます(\\\\)+
。そしてそれはGreedy(!)オプションです:((\\\\)+)?+
{Greedy matching}、文字列が空であるか、またはペアを終了しないためです!"(.*?[^\\])?(\\\\)*"
ここに "と"の両方で機能するものがあり、最初に他の人を簡単に追加できます。
( "| ')(?:\\\ 1 | [^ \ 1])*?\ 1
最初のグループ( "または ')にあるものと完全に一致する後方参照(\ 1)を使用します。
[^\1]
置き換える必要が.
あります。最初の条件は、何か問題が発生する前に常に一致します。
[^\1]
と、.
この正規表現が事実上に変更さ("|').*?\1
れ、で一致"foo\"
し"foo \" bar"
ます。とはいえ[^\1]
、実際に仕事をするのは難しいです。@ mathiashansen -あなたは扱いにくく、高価で、より良いオフにしている(?!\1).
(全体の正規表現ので、いくつかの効率のクリーンアップで、でしょう(["'])(?:\\.|(?!\1).)*+\1
。+
あなたのエンジンがそれをサポートしていない場合は省略可能です。
これまで触れられたことがないオプションは次のとおりです。
これには、エスケープされたオープンタグを正しく照合できるという追加のボーナスがあります。
次の文字列があったとしましょう。String \"this "should" NOT match\" and "this \"should\" match"
ここで\"this "should" NOT match\"
は、一致して"should"
はならず、一致する必要があります。その上でthis \"should\" match
一致する必要があり、一致してはなり\"should\"
ません。
最初の例。
// The input string.
const myString = 'String \\"this "should" NOT match\\" and "this \\"should\\" match"';
// The RegExp.
const regExp = new RegExp(
// Match close
'([\'"])(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))' +
'((?:' +
// Match escaped close quote
'(?:\\1(?=(?:[\\\\]{2})*[\\\\](?![\\\\])))|' +
// Match everything thats not the close quote
'(?:(?!\\1).)' +
'){0,})' +
// Match open
'(\\1)(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))',
'g'
);
// Reverse the matched strings.
matches = myString
// Reverse the string.
.split('').reverse().join('')
// '"hctam "\dluohs"\ siht" dna "\hctam TON "dluohs" siht"\ gnirtS'
// Match the quoted
.match(regExp)
// ['"hctam "\dluohs"\ siht"', '"dluohs"']
// Reverse the matches
.map(x => x.split('').reverse().join(''))
// ['"this \"should\" match"', '"should"']
// Re order the matches
.reverse();
// ['"should"', '"this \"should\" match"']
では、RegExpについて説明しましょう。これは、正規表現を簡単に3つの部分に分割できることです。次のように:
# Part 1
(['"]) # Match a closing quotation mark " or '
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
# Part 2
((?: # Match inside the quotes
(?: # Match option 1:
\1 # Match the closing quote
(?= # As long as it's followed by
(?:\\\\)* # A pair of escape characters
\\ #
(?![\\]) # As long as that's not followed by an escape
) # and a single escape
)| # OR
(?: # Match option 2:
(?!\1). # Any character that isn't the closing quote
)
)*) # Match the group 0 or more times
# Part 3
(\1) # Match an open quotation mark that is the same as the closing one
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
これはおそらく画像形式ではるかに明確です:JexのRegulexを使用して生成
githubの画像(JavaScript正規表現ビジュアライザー) 申し訳ありませんが、画像を含めるのに十分な評判がないため、現時点ではリンクにすぎません。
この概念を使用した関数の例の要点を次に示します。https://gist.github.com/scagood/bd99371c072d49a4fee29d193252f5fc#file-matchquotes-js
https://stackoverflow.com/a/10786066/1794894のより広範なバージョン
/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/
このバージョンには、
“
とクローズ”
)最初から検索すると、うまくいくのでは?
\"((\\\")|[^\\])*\"