簡単な質問:私のパターンはsvg文字列であり、l 5 0 l 0 10 l -5 0 l 0 -10
のように見えます。参照に対してユニットテストの比較を行うには、最初のl
以外のすべてを破棄する必要があります。 'l'を前もって、または部分文字列を使用できます。しかし、私はこれのためのjavascript正規表現イディオムがあるのだろうか?
最初のパターン一致以外のすべてを置き換えるJSRegExpはありません。ただし、関数を2番目の引数としてreplace
methodに渡すことにより、この動作を実装できます。
var regexp = /(foo bar )(red)/g; //Example
var string = "somethingfoo bar red foo bar red red pink foo bar red red";
var first = true;
//The arguments of the function are similar to $0 $1 $2 $3 etc
var fn_replaceBy = function(match, group1, group2){ //group in accordance with RE
if (first) {
first = false;
return match;
}
// Else, deal with RegExp, for example:
return group1 + group2.toUpperCase();
}
string = string.replace(regexp, fn_replaceBy);
//equals string = "something foo bar red foo bar RED red pink foo bar RED red"
関数(fn_replaceBy
)は、一致するたびに実行されます。最初の一致で、関数は一致した文字列ですぐに戻り(何も起こりません)、フラグが設定されます。
他のすべての一致は、関数で説明されているロジックに従って置き換えられます。通常、グループを参照するには、$0 $1 $2
などを使用します。 fn_replaceBy
では、関数の引数は次のようになります。最初の引数= $0
、2番目の引数= $1
など。
一致した部分文字列は、関数fn_replaceBy
の戻り値に置き換えられます。 replace
の2番目のパラメーターとして関数を使用すると、 インテリジェントHTMLパーサー などの非常に強力なアプリケーションが可能になります。
"l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '')
最初の'l'
の前にスペースがないことを確認し、その後の'l'
が続くスペースを削除します。
これは最も美しい解決策ではありませんが、最初のオカレンスを任意のもの(プレースホルダーなど)に置き換え、残りのロジックを実行するためにチェーンを置き換えることができます。
'-98324792u4234jkdfhk.sj.dh-f01' // construct valid float
.replace(/[^\d\.-]/g, '') // first, remove all characters that aren't common
.replace(/(?!^)-/g, '') // replace negative characters that aren't in beginning
.replace('.', '%FD%') // replace first occurrence of decimal point (placeholder)
.replace(/\./g, '') // now replace all but first occurrence (refer to above)
.replace(/%FD%(0+)?$/, '') // remove placeholder if not necessary at end of string
.replace('%FD%', '.') // otherwise, replace placeholder with period
生産:
-983247924234.01
これは、文字列の最初の文字である最初の一致/出現に依存できない例を探している人のために受け入れられた答えを拡張するだけです。
フラグが立てられたanserは実質的に間違っています。最初の出現は、文字列がそのパターンで始まることを意味しません。