在正则表达式中,我需要知道如何匹配一件事或另一件事,或两者(按顺序)。但至少需要有一件事情存在。
例如下面的正则表达式
/^([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/