【问题标题】:Javascript Combine 2 regexesJavascript结合2个正则表达式
【发布时间】:2020-06-19 00:54:55
【问题描述】:

我有几个正则表达式,我打算合并它们。 所以第一个正则表达式如下(允许带有特定千位和小数分隔符的金额)

"^-?(\\d+|\\d{1,3}(,\\d{3})*)?(\\.(\\d+)?)?$"

我有类似的其他正则表达式(基于不同的语言环境,例如,另一个将逗号作为小数分隔符)

因此,使用上述正则表达式,以下是有效/无效值

123.11 (Valid)
1'23 (Invalid)

使用第二个正则表达式,我希望字符串最多可以包含 13 位数字(包括小数点之前或之后)

^[^\\d]*?(\\d|\\d[^\\d]+){0,13}$

使用上述正则表达式,以下是有效/无效值

1234567890123 (Valid - 13 digits)
12345678901234 (Invalid - 14 digits)
1234567890.123 (Valid as 13 digits...10.3)
1234567890.1234 (Invalid as 14 digits...10.4)

是否有可能以某种方式合并 2 正则表达式? 但是,我不想触及第一个正则表达式(根据不同的语言环境有不同的组合)。但是以某种方式将第二个正则表达式动态附加到第一个正则表达式中会很好吗?

所以,我对第二个正则表达式很灵活,因为它不基于任何语言环境,但将始终相同,主要验证字符串中最多 13 位数字。

然后我将使用合并的正则表达式验证我的字符串。

【问题讨论】:

  • coz,否则我必须编写一些额外的逻辑来验证我目前常用的正则表达式验证方法中的 2 个单独的正则表达式......我试图不触及该方法,而是有一个合并的正则表达式来验证...
  • 为什么不直接做regex1.test(value) && regex2.test(value)?我不明白您为什么要动态组合它们。这是可能的,但容易出错,而且比简单地使用两者要困难得多。
  • 实际上,有很多事情......但我正在使用 cp 验证库并设置我的对象,然后在我有逻辑的地方有一个通用/自定义的正则表达式混合......所以,有点难以解释为什么我不能直接做 && 检查

标签: javascript regex


【解决方案1】:

您可以保持第一个模式不变,只需在前面加上

(?=^\D*(?:\d\D*){0,13}$)

(?=^\D*(?:\d\D*){0,13}$) 模式表示正向前瞻,它匹配紧随其后的位置

  • ^ - 字符串开头
  • \D* - 0+ 个非数字
  • (?:\d\D*){0,13} - 数字出现 0 到 13 次,后跟非数字字符
  • $ - 字符串结束。

完整的 JavaScript 正则表达式定义:

var regex1 = "^-?(\\d+|\\d{1,3}(,\\d{3})*)?(\\.(\\d+)?)?$";     // Not to be touched
var consolidated_regex = "(?=^\\D*(?:\\d\\D*){0,13}$)" + regex1;    

full regex demo

详情

【讨论】:

  • 太棒了...这似乎正是我正在寻找的东西...我现在将测试所有值...但是再一次,这似乎很完美。谢谢
  • 似乎是我的答案,是吗?
  • @Edward 不,这与您的模式相去甚远。它没有多余的(?=.) 前瞻,包含一个更有效的\D 构造来匹配任何非数字字符,展示了一种技术如何在不改变第一个正则表达式的情况下保留一个模式并用另一个模式限制它。
  • 花哨,引擎 \D 在编译时被其类 [^\d] 替换。 (?=.)(?=[^\d]*(?:\d[^\d]*){0,13}$) 的剩余部分,当他使用具有所有可选术语的跟随者表达式时,保证角色存在,而 OP 不知道更好。我把它改成了(?=[^\d]*(?:\d[^\d]*){1,13}$),谁在乎它是否留在里面。最后,有 trgex 技术 可以将我的模式与另一个模式结合起来,ots 称为字符串连接。正确的英文单词是前缀而不是前置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2015-01-14
  • 2018-07-04
  • 2016-07-30
相关资源
最近更新 更多