Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在正则表达式中,匹配一项或另一项,或两者都匹配_Javascript_Regex - Fatal编程技术网

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]+$/
      您的编辑会使事情复杂化,但您仍然可以非常简单地执行此操作,特别是如果您首先使用空格进行分割。请看我的编辑。谢谢!是的,我们需要使用数千,因为这在用户和应用程序之间有点来回,两者都可能在输入字段中设置值。该应用程序将始终在带有数千个分隔符的输入框中显示数字,因此,如果用户随后重新提交该数字,我们希望它进行验证。