24

私は正規表現に不慣れであり、これは非常に簡単な質問かもしれません(うまくいけば)。

3種類の文字列に1つのソリューションを使用しようとしています

  • 「45%」、期待される結果:「45」
  • 「45」、期待される結果:「45」
  • ""、 期待される結果: ""

私が試していること(文字列をstrにする):

str.match(/(.*)(?!%*)/i)[1]

これは私の頭の中では、「見つかった場合は「%」までの任意のインスタンスに一致するか、それ以外の場合は何かに一致する」ように聞こえます。

ファイヤーバグの頭の中では、「何かに一致し、ネガティブな先読みを完全に無視する」ように聞こえます。また、それを怠惰にするために---(.*)?役に立たないようです。

この特定の状況では、私は数字だけを照合しているので、そうする/\d*/ことを少しの間忘れましょう。いつでも適用できるように、一般的なルールを理解しようとしています。

誰かが私を助けてくれるほど親切ですか?

4

5 に答える 5

39

もっとシンプルなのはどうですか

str.match(/[^%]*/i)[0]

つまり、0個以上の文字に一致します。これは。ではありません%


編集:まで解析する必要がある場合</a>は、シーケンスpf文字を解析し、次に、を解析</a>してから、を破棄できます。これは、負ではなく正の先読みを</a>使用する必要があることを意味します。

str.match(/.*?(?=<\/a>|$)/i)[0]

</a>これは、文字列のまたは最後に到達するまで、0個以上の文字を怠惰に一致させることを意味します。

*?は単一の演算子で(.*)?あり、と同じではないことに注意してください.*?

(そして、いつものように、単一の正規表現でHTMLを解析しないでください。)

于 2011-12-21T03:23:51.317 に答える
9

私はこれがあなたが探しているものだと思います:

/(?:(?!%).)*/

すべての.文字に一致しますが、負の先読み、、の後でのみ(?!%)、文字がではないことを確認し%ます。番兵がのような単一の文字である場合、%代わりに否定された文字クラスを使用できることに注意してください。次に例を示します。

/[^%]*/

ただし、のような複数文字の番兵の</a>場合は、先読みアプローチを使用する必要があります。

/(?:(?!</a>).)*/i

これは実際には「一度に0個以上の文字を一致させますが、次の文字がシーケンスの先頭であることが判明した場合は、</a>それ</A>を消費せずに停止します」と言っています。

于 2011-12-21T04:46:24.047 に答える
3

正確な検索文字列を使用する最も簡単な方法は、正規表現をスキップしてindexOf、次のように使用することです。

// String to be searched
var s = "Here is a <a>link</a>."

// String to find
var searchString = "</a>";

// Final match
var matched = "";

var c = s.indexOf(searchString);
if (c >= 0)
{
    // Returns the portion not including the search string;
    // in this example, "Here is a <a>link". If you want the
    // search string included, add the length of the search
    // string to c.
    matched = s.substring(c);
}
于 2011-12-21T03:44:48.833 に答える
1

私はちょうどあなたがそれを言ったようにそれを正確に書きました:

str.match(/(^[^%]*$)|^([^%]*)%.*/i)

これは、「%」のない任意の文字列、または%を含む文字列の最初の部分に一致します。1番目または2番目のグループから結果を取得する必要があります。

編集:これはまさにあなたが以下に望むものです

str.match(/(?:^[^%]*$)|^(?:[^%]*)(?=%)/)
  • ?:すべてのグループ化を削除します
  • ?=は、文字列に%が含まれているかどうかを確認するための先読みです。
  • [^%]は、%以外の任意の文字に一致します

したがって、正規表現の読み取りは、%を含まない任意の文字列に一致するか、最初の%より前のすべての文字に一致します(そうでない場合は一致します)。

于 2011-12-21T03:40:23.273 に答える
0

45、45%、および任意の数の任意の長さに一致させるには、これを使用します(182%、18242な​​ど)

str.match(/([0-9]+)([%]?)/)[1];

空の文字列を一致させる必要がある場合は、それを^ $として含めます。空の文字列に対して、match( "...")[1]は未定義になるため、一致をテストしてから[0]またはをチェックする必要があります。 [1]が未定義かどうかを確認してください。

str.match(/([0-9]+)([%]?)|^$/)

正確に2桁の数字を一致させる必要がある場合は、{2,2}を使用して、開始行と終了行の文字の間に式を固定します。 " ^(exp)$ "

str.match(/^([0-9]{2,2})([%]?)$/)[1];
于 2011-12-21T04:21:40.027 に答える