javascript - 在正则表达式中,匹配一件事或另一件事,或两者都匹配

标签 javascript regex

在正则表达式中,我需要知道如何匹配一件事或另一件事,或两者(按顺序)。但至少需要有一件事情存在。

例如下面的正则表达式

/^([0-9]+|\.[0-9]+)$/

将匹配

234

.56

但不是

234.56

而下面的正则表达式

/^([0-9]+)?(\.[0-9]+)?$/

将匹配上面的所有三个字符串,但它也会匹配空字符串,这是我们不想要的。

我需要一些能匹配上面所有三个字符串的东西,但不能匹配空字符串。有没有简单的方法可以做到这一点?

更新:

下面的安德鲁和贾斯汀都适用于我提供的简化示例,但它们不适用于(除非我弄错了)我希望解决的实际用例,所以我现在应该将其放入。这是我正在使用的实际正则表达式:

/^\s*-?0*(?:[0-9]+|[0-9]{1,3}(?:,[0-9]{3})+)(?:\.[0-9]*)?(\s*|[A-Za-z_]*)*$/

这将匹配

45
45.988
45,689
34,569,098,233
567,900.90
-9
-34 banana fries
0.56 points

但它不匹配

.56

我需要它来做到这一点。

最佳答案

给定正则表达式 /^A$//^B$/ 的完全通用方法是:

/^(A|B|AB)$/

/^([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/

请注意,其他人已使用您的示例的结构进行简化。具体来说,他们(隐式)对其进行因式分解,以提取左侧和右侧常见的 [0-9]*[0-9]+ 因子。

其工作原理是:

  • 所有交替元素都以 [0-9]+ 结尾,因此将其取出:/^(|\.|[0-9]+\.)[ 0-9]+$/
  • 现在我们在交替中可能出现空字符串,因此使用 ? 重写它(即使用等价 (|a|b) = (a|b)?): /^(\.|[0-9]+\.)?[0-9]+$/
  • 再次使用通用后缀(\.)进行替换:/^((|[0-9]+)\.)?[0-9]+ $/
  • 模式(|a+)a*相同,所以最后:/^([0-9]*\.)? [0-9]+$/

关于javascript - 在正则表达式中,匹配一件事或另一件事,或两者都匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351990/

相关文章:

javascript - 如何将history.pushState与浏览器的后退功能结合使用

java - 正则表达式,匹配特定XML标签的内容,但不包含标签本身

regex - 使用正则表达式和Powershell从字符串中提取特定数据

java - 如何从 Java 中的 txt 文件读取 2 个特定列?

javascript - 自定义事件和postMessage的区别

javascript - 如果输入文件在没有表单的ajax请求中作为数组元素传递,为什么数组对象变为空

javascript - 如何根据屏幕截图自定义滚动条?

regex - 需要正则表达式来匹配单词或字符串结尾

r - 在每第 N 个单词后插入字符串

javascript - 切片数组并从 RTL/LTR 转换