正则表达式匹配字符串中的数字但不匹配百分比

时间:2012-11-03 19:38:18

标签: javascript regex

我需要知道是否有一个正则表达式来测试字符串中是否存在数字:

  • 匹配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 { {1}}。另外,除了20%字符之外,我不知道如何告诉不是整个percent字符串

3 个答案:

答案 0 :(得分:9)

这将满足您的需求:

\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'

- 编辑 -

这里的主要是在最后一行使用“否定前瞻”,如果在数字和一个或多个空格之后出现任何百分号或文字“百分比”,则导致匹配失败。可以在Negative lookahead Regular Expression

找到JavaScript RegExps中负向前瞻的其他用法

- 2ND编辑 - 恭喜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

答案 1 :(得分: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'
  )
)

答案 2 :(得分:0)

使用negative lookahead代替您的否定字符类:

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