7

文字列内の数字の存在をテストするための正規表現があるかどうかを知る必要があります。

  • マッチLorem 20 Ipsum
  • マッチLorem 2,5 Ipsum
  • マッチLorem 20.5 Ipsum
  • 一致しませLorem 2% Ipsum
  • 一致しませLorem 20.5% Ipsum
  • 一致しませLorem 20,5% Ipsum
  • 一致しませLorem 2 percent Ipsum
  • 一致しませLorem 20.5 percent Ipsum
  • 一致しませLorem 20,5 percent Ipsum
  • マッチLorem 20 Ipsum 2% dolor
  • マッチLorem 2,5 Ipsum 20.5% dolor
  • マッチLorem 20.5 Ipsum 20,5% dolor

つまり、文字列に 1 つまたは複数の数値があるかどうかを示す正規表現ですが、パーセンテージ値ではありません。

として何かを試しましたが、これはうまくいかないようです。数字はパーセンテージ記号ではなく、文字列の にも一致する/[0-9\.,]+[^%]/ためだと思います。さらに、文字に加えて文字列全体ではないことを伝える方法がわかりません。2020%percent%

4

3 に答える 3

13

これはあなたが必要とすることをします:

\b                     -- word boundary
\d+                    -- one or more digits
(?:\.\d+)?             -- optionally followed by a period and one or more digits
\b                     -- word boundary
\s+                    -- one or more spaces
(?!%|percent)          -- NOT followed by a % or the word 'percent'

- 編集 -

ここで重要なのは、最終行での「否定先読み」の使用です。これにより、パーセント記号または文字どおりの「パーセント」のいずれかが数字と 1 つ以上のスペースの後に出現すると、一致が失敗します。JavaScript RegExp での否定先読みのその他の使用法については、否定先読みの正規表現を参照してください。

--2ND EDIT--最も一般的なケースを解決したエンリコにおめでとうですが、以下の彼の解決策は正しいですが、いくつかの無関係な演算子が含まれています。これが最も簡潔な解決策です。

(                         -- start capture
  \d+                     -- one or more digits
  (?:[\.,]\d+)?           -- optional period or comma followed by one or more digits
  \b                      -- word boundary
  (?!                     -- start negative lookahead
    (?:[\.,]\d+)          -- must not be followed by period or comma plus digits
  |                       --    or
    (?:                   -- start option group
      \s?%                -- optional space plus percent sign
    |                     --   or
      \spercent           -- required space and literal 'percent'
    )                     -- end option group
  )                       -- end negative lookahead
)                         -- end capture group
于 2012-11-03T19:45:57.480 に答える
7

これはそれを行うための堅牢な方法であり、数値も抽出しています。

(\b\d+(?:[\.,]\d+)?\b(?!(?:[\.,]\d+)|(?:\s*(?:%|percent))))

これは Rob の正規表現に似ていますが、すべてのケースで機能するはずです。

(                          -- capturing block
  \b                       -- word boundary
  \d+                      -- one or more digits
  (?:[\.,]\d+)?            -- optionally followed by a period or a comma
                              and one or more digits
  \b                       -- word boundary
  (?!                      -- not followed by
    (?:[\.,]\d+)           -- a period or a comma and one or more digits
                              [that is the trick]
    |                      -- or
    (?:\s*(?:%|percent))   -- zero or more spaces and the % sign or 'percent'
  )
)
于 2012-11-03T20:42:46.447 に答える
0

否定文字クラスの代わりに否定先読みを使用します。

/\d+(?:[,.]\d+)?(?!\s*(?:percent|%))/
于 2012-11-03T20:05:46.440 に答える