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

也就是说,一个正则表达式可以告诉我字符串中是否有一个或多个数字,但不是百分比值。

我已经尝试过/[0-9\.,]+[^%]/,但这似乎不起作用,我认为因为数字然后不是百分号也匹配20字符串中的20%。此外,除了字符之外,我不知道如何分辨整个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'

- 编辑 -

这里的重点是在最后一行使用“负前瞻”,如果在数字和一个或多个空格之后出现任何百分号或文字“百分比”,则会导致匹配失败。JavaScript RegExps 中负前瞻的其他用途可以在负前瞻正则表达式中找到

--2ND EDIT-- 祝贺 Enrico 解决了最一般的情况,但尽管他的以下解决方案是正确的,但它包含几个无关的运算符。这是最简洁的解决方案。

(                         -- 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 回答