Javascript 在正则表达式中,匹配一项或另一项,或两者都匹配
在正则表达式中,我需要知道如何匹配一件事或另一件事,或两者(按顺序)匹配。但至少有一件事需要做到 例如,下面的正则表达式Javascript 在正则表达式中,匹配一项或另一项,或两者都匹配,javascript,regex,Javascript,Regex,在正则表达式中,我需要知道如何匹配一件事或另一件事,或两者(按顺序)匹配。但至少有一件事需要做到 例如,下面的正则表达式 /^([0-9]+|\.[0-9]+)$/ /^([0-9]+)?(\.[0-9]+)?$/ 将匹配 234 45 45.988 45,689 34,569,098,233 567,900.90 -9 -34 banana fries 0.56 points 及 但不是 234.56 而下面的正则表达式 /^([0-9]+|\.[0-9]+)$/ /^([0-9]
/^([0-9]+|\.[0-9]+)$/
/^([0-9]+)?(\.[0-9]+)?$/
将匹配
234
45
45.988
45,689
34,569,098,233
567,900.90
-9
-34 banana fries
0.56 points
及
但不是
234.56
而下面的正则表达式
/^([0-9]+|\.[0-9]+)$/
/^([0-9]+)?(\.[0-9]+)?$/
将匹配上面所有三个字符串,但它也将匹配我们不需要的空字符串
我需要的东西将匹配以上所有三个字符串,但不是空字符串。有没有一个简单的方法
更新:
下面的Andrew和Justin都适用于我提供的简化示例,但它们(除非我弄错了)不适用于我希望解决的实际用例,所以我现在应该把它们放进去。下面是我使用的实际regexp:
/^\s*-?0*(?:[0-9]+|[0-9]{1,3}(?:,[0-9]{3})+)(?:\.[0-9]*)?(\s*|[A-Za-z_]*)*$/
这将匹配
234
45
45.988
45,689
34,569,098,233
567,900.90
-9
-34 banana fries
0.56 points
但它不匹配
.56
我需要它来实现这一点。是的,你可以用这样一个表达式来匹配所有这些:
/^[0-9]*\.?[0-9]+$/
注意,它也与空字符串(您的上一个条件)不匹配。当然。您需要可选的量词,
?
/^(?=.)([0-9]+)?(\.[0-9]+)?$/
上面的内容看起来有点笨拙,但我想用一些?
来展示您的确切模式。在这个版本中,(?=)
确保它不接受空字符串,因为我将这两个子句都设置为可选。更简单的版本是:
/^\d*\.?\d+$/
这满足了您的要求,包括防止出现空字符串
请注意,有许多方法可以表达这一点。有些很长,有些很简洁,但是
编辑:
如果您想在更大的字符串中匹配它,我建议使用/^\d*\.?\d+$/
拆分并测试结果。否则,您将面临匹配内容(如aaa.123.456.bbb
)或缺少匹配的风险(相信我,您会的。JavaScript缺乏lookback支持,这将确保有可能打破我能想到的任何模式)
如果您知道无法获得如上所述的字符串,可以使用分词代替^$
锚定,但这会变得复杂,因为
和
之间没有分词(空格)
应该这样做。它将阻止像aaa123.456bb
这样的内容,但它将允许123
、456
或123.456
。它将允许aaa.123.456.bbb
,但正如我所说的,如果您想全面处理这个问题,需要两个步骤
编辑2:您的用例
如果你想在开头留空格,在结尾留负号/正号,这些都是相当严格的规则。这是件好事。您可以将它们添加到上面最简单的模式中:
/^\s*[-+]?\d*\.?\d+[a-z_\s]*$/i
允许数千人分组会使事情变得非常复杂,我建议你看看我链接到的答案。以下是结果模式:
/^\s*[-+]?(\d+|\d{1,3}(,\d{3})*)?(\.\d+)?\b(\s[a-z_\s]*)?$/i
\b
确保数字部分以数字结尾,后面至少有一个空格。给定正则表达式/^a$/
和/^b$/
的完全通用方法是:
/^(A|B|AB)$/
i、 e
请注意,其他人使用了示例的结构进行了简化。具体地说,他们(隐式地)将其分解,以提取左右两侧的公共[0-9]*
和[0-9]+
因子
为此开展的工作包括:
- 替换的所有元素都以
结尾,因此将其拉出:[0-9]+
/^(| \.[0-9]+\)[0-9]+$/
- 现在我们有可能在替换中使用空字符串,所以使用
(即使用等价的?
):(|a | b)=(a | b)?
/^(\.[124;[0-9]+\)?[0-9]+$/
- 同样,使用一个公共后缀(
这次):\。
/^(([0-9]+)\)?[0-9]+$/
- 模式
与(|a+
相同,因此,最后:a*
/^([0-9]*\)?[0-9]+$/
- 也许这有助于(让你大致了解一下):
(?:(?(数字)。^[A-Za-z]+)(?\d+){1,2}
此模式匹配字符、数字或字符后的数字,但不匹配数字后的字符。
模式匹配aa、aa11和11,但不匹配11aa、aa11aa或空字符串。
不要对“^”感到困惑,它的意思是“一个字符后跟行开始”,它的目的是阻止任何匹配
请注意,这并不适用于所有风格的正则表达式,您的正则表达式版本必须支持(?(命名组)true | false)
huon给出的回答很好(并在后面加上一点脑筋急转弯)。对于任何想快速简单地回答这个问题的人来说,“在正则表达式中,匹配一个或另一个,或两者都匹配”,值得一提的是,甚至(a | B | AB)也可以简化为:
A|A?B
如果B稍微复杂一点,就很方便。谢谢。我甚至没有想到暴力的一般解决方案。或者
/^[0-9]*\.?[0-9]+$/
您的编辑会使事情复杂化,但您仍然可以非常简单地执行此操作,特别是如果您首先使用空格进行分割。请看我的编辑。谢谢!是的,我们需要使用数千,因为这在用户和应用程序之间有点来回,两者都可能在输入字段中设置值。该应用程序将始终在带有数千个分隔符的输入框中显示数字,因此,如果用户随后重新提交该数字,我们希望它进行验证。