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:)