web-dev-qa-db-ja.com

Javascriptの正規表現:何かまで存在するものがある場合はそれまで一致します

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

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

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

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

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

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

Firebugの頭では、「何にでもマッチし、否定的な先読みを完全に無視する」ように聞こえます。また、怠惰にする-(.*)?-役に立たないようです。

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

誰かが私を助けてくれてとても親切でしょうか?

19
undefinederror

単純なのはどうですか

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

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


編集:</a>まで解析する必要がある場合、pf文字に続いて</a>を解析してから、 </a>を破棄します。つまり、ネガティブの代わりにpositive先読みを使用する必要があります。

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

つまり、</a>または文字列の終わりに到達するまで、ゼロ以上の文字を遅延して一致させます。

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

(そして 通常どおり、単一の正規表現でHTMLを解析しないでください 。)

27
kennytm

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

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

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

/[^%]*/

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

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

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

6
Alan Moore

exact検索文字列を使用する最も簡単な方法は、正規表現をスキップして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);
}
3
bobbymcr

私はちょうどあなたがそれを言った方法を正確に書いた:

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

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

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

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

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

1
jermel

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];
0
Richard Logwood