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

Javascript 匹配字符串中的数字但不匹配百分比的正则表达式,javascript,regex,Javascript,Regex,我需要知道是否有一个正则表达式用于测试字符串中是否存在数字: 匹配Lorem 20 Ipsum 匹配Lorem 2,5 Ipsum 匹配Lorem 20.5 Ipsum 不匹配Lorem 2%Ipsum 不匹配Lorem 20.5%同侧睡眠 不匹配Lorem 20,5%同侧睡眠 不匹配Lorem 2%同侧眼 不匹配Lorem 20.5%同侧睡眠 不匹配Lorem 20,5%同侧眼 匹配Lorem 20 Ipsum 2%dolor 匹配Lorem 2,5 Ipsum 20.5%dolor 匹配L

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

  • 匹配
    Lorem 20 Ipsum
  • 匹配
    Lorem 2,5 Ipsum
  • 匹配
    Lorem 20.5 Ipsum
  • 不匹配
    Lorem 2%Ipsum
  • 不匹配
    Lorem 20.5%同侧睡眠
  • 不匹配
    Lorem 20,5%同侧睡眠
  • 不匹配
    Lorem 2%同侧眼
  • 不匹配
    Lorem 20.5%同侧睡眠
  • 不匹配
    Lorem 20,5%同侧眼
  • 匹配
    Lorem 20 Ipsum 2%dolor
  • 匹配
    Lorem 2,5 Ipsum 20.5%dolor
  • 匹配
    Lorem 20.5 Ipsum 20,5%dolor
也就是说,一个正则表达式可以告诉我字符串中是否有一个或多个数字,而不是百分比值


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

这将满足您的需要:

\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正则表达式中负前瞻的其他用法可以在

--第二版-- 祝贺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
使用而不是否定的字符类:

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

这是一种健壮的方法,它还可以提取数字

(\b\d+(?:[\.,]\d+)?\b(?!(?:[\.,]\d+)|(?:\s*(?:%|percent))))
它类似于Rob的regex,但适用于所有情况

(                          -- 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'
  )
)

您错过了,作为小数分隔符。(只是一个提示)感谢您的评论,但OP没有要求提取数字,也没有要求在一个字符串中出现多少数字,只是要求它们存在。我的答案将匹配包含非百分比数字的字符串,因此匹配逗号对OP的要求无关紧要。再次感谢。由于十进制的可选性,这个正则表达式匹配20.5%part@enrico,我不相信你是对的。由于要求数字后面有一个或多个空格,20.5%的数字不匹配。@rob,是的,类似的数字不匹配,但数字后面必须有空格才能成为数字的事实是错误的。这将不匹配字符串末尾的数字或后跟任何非空格的数字。例如,句子“我必须支付12.5美元”或“数字是5”。包含的数字不是百分比。所以你的正则表达式对于lorenzo提供的所有测试用例都是正确的,但并不总是有效。这正是我在阅读Rob答案后使用的。谢谢,+1@Bergi,不要挑太多的毛病,但您的解决方案将匹配:“10.1%,这可能不是所需的。”哈哈,你的一个通过了所有提供的测试,而且你比我快多了,所以对你来说也是+1:)