web-dev-qa-db-ja.com

すべてを置き換える方法しかし、文字列内のパターンの最初の出現

簡単な質問:私のパターンはsvg文字列であり、l 5 0 l 0 10 l -5 0 l 0 -10のように見えます。参照に対してユニットテストの比較を行うには、最初のl以外のすべてを破棄する必要があります。 'l'を前もって、または部分文字列を使用できます。しかし、私はこれのためのjavascript正規表現イディオムがあるのだろうか?

19
dr jerry

文字列の開始を避けて、負の先読みを試すことができます。

/(?!^)l/g

オンラインかどうかを確認します: jsfiddle

30
Mark Byers

最初のパターン一致以外のすべてを置き換えるJSRegExpはありません。ただし、関数を2番目の引数としてreplacemethodに渡すことにより、この動作を実装できます。

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パーサー などの非常に強力なアプリケーションが可能になります。

参照: MDN:String.replace>関数をパラメーターとして指定

7
Rob W
 "l 5 0 l 0 10 l -5 0 l 0 -10".replace(/^\s+/, '').replace(/\s+l/g, '')

最初の'l'の前にスペースがないことを確認し、その後の'l'が続くスペースを削除します。

2
Mike Samuel

これは最も美しい解決策ではありませんが、最初のオカレンスを任意のもの(プレースホルダーなど)に置き換え、残りのロジックを実行するためにチェーンを置き換えることができます。

'-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

これは、文字列の最初の文字である最初の一致/出現に依存できない例を探している人のために受け入れられた答えを拡張するだけです。

1
Erutan409

フラグが立てられたanserは実質的に間違っています。最初の出現は、文字列がそのパターンで始まることを意味しません。

0