我需要知道是否有一个正则表达式来测试字符串中是否存在数字:
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
字符串。
答案 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|%))/