2

JavaScriptを使用して、特定のパターンの最初のインスタンスの文字列をチェックし、パターン以降のすべてを返す必要があります。典型的な文字列、パターン、および望ましい結果については、以下の例を参照してください。

私が抱えている主な問題は、パターンに括弧などの特殊文字がほぼ確実に含まれることです。これらの特殊文字をエスケープするためにパターンを手動で変更することはできません。私が最初にそれを行うことができない限りreplace

result = string.match(pattern.replace(エスケープされた場合は特別))

そのようなことが可能かどうかはわかりません。正規表現は常に私に頭痛の種を与えます、そして私は正しい、または代替の方向へのどんな指針でもありがたいです。

バックグラウンド

私はLESSのためにいくつかの複雑なミックスインをしようとしています。そのため、バックティックでエスケープすることにより、1行のJavaScriptに制限されます。LESSでのJavaSCriptの使用に関する情報については、ここを参照してください。新しい可変個引数引数のサポートを使用して、複数のカラーストップを取得したいと思っていました。例:。radial-gradient(@shape, @position, @colorStops...)ただし、LESSは、@argumentsを使用するときに渡される引数の全範囲のみを提供します。したがって、正規表現を使用して文字列に@argumentsを使用し、パターンに@colorStopを使用して、最初のカラーストップ以降を含むすべてを返すことを望んでいます。@colorStopを使用すると、LESSは最初のカラーストップ変数を返します。一般的な概念はここから取られました)

例えば:

文字列:円0%50%rgba(96、16、48、0)9px#661133 10px rgba(96、16、48、0)11px

パターン:rgba(96、16、48、0)9px

結果:rgba(96、16、48、0)9px#661133 10px rgba(96、16、48、0)11px

4

2 に答える 2

2

「これらの特殊文字をエスケープするためにパターンを手動で変更することはできません。最初に.replaceを使用してそれを行うことができない限り?」

はい、できます。正規表現パターンを含む文字列patternである変数が与えられた場合、次のようになります。

pattern = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');

...正規表現で特別な意味を持つすべての文字をエスケープし、結果を同じ変数に戻します。もちろん、これは、パターン内のすべての文字が一致するリテラル文字と見なされる場合にのみ機能します。

「特定のパターンの最初のインスタンスの文字列をチェックし、パターン以降のすべてを返す必要があります。」

パターンの最後に追加.*するだけなので、指定されたビットに一致し、その後に次のすべての文字が続きます。つまり、正規表現/abc/がの最初のインスタンスと一致する場合、正規表現は"abc"それに続くすべての文字/abc.*/と一致します。"abc"(正規表現では、.任意の文字に*一致し、前のビットに0回以上一致します。デフォルトでは、「欲張り」一致を実行します。)

これをまとめる:

function matchToEnd(pattern, str) {
    var re = new RegExp(pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') + ".*"),
        result = str.match(re);
    if (result)
       return result[0];
    else {
       // didn't match, return default value of your choice, e.g.:
       return null;
    }
}

var result = matchToEnd("rgba(96, 16, 48, 0) 9px",
                        "rgba(96, 16, 48, 0) 9px #661133 10px rgba(96, 16, 48, 0) 11px");

デモ: http: //jsfiddle.net/JVdnz/

以前に行った仮定に戻ると、正規表現パターンには正規表現で特別な意味を持つ文字が含まれていないことに注意してください。その場合は、このタスクを実行するために正規表現は必要ありません。メソッドを.indexOf()メソッドと組み合わせて使用​​するだけです:.substr()

var i = str.indexOf(pattern);  // find index of first instance of pattern
if (i != -1)
   return str.substr(i);       // return from that index to end of string

これは前のデモと似ていますが.indexOf()、正規表現の代わりにデモがあります:http: //jsfiddle.net/JVdnz/1/

于 2012-09-13T04:42:55.953 に答える
1

パターンで正規表現機能を使用する必要がなく、最初のオカレンスを置き換えるだけでよい場合は、パターンとして文字列をreplaceメソッドに渡すだけです。

それ以外の場合(正規表現機能が必要な場合、またはパターンのすべての出現箇所を置き換える必要がある場合) 、文字列内の特殊文字をエスケープして正規表現オブジェクトを動的に生成する関数を作成できます。

于 2012-09-13T02:33:33.937 に答える