JavaScript /使用系统生成的regex进行验证

时间:2018-01-30 13:44:18

标签: javascript regex

我们希望使用正则表达式来验证文档结构。为此,我们简化了文档和正则表达式。正则表达式是从用于验证的模式生成的。 该应用程序是完全基于客户端的,并使用JavaScript编码。

一个简单的例子是这个正则表达式:

regex1 = new RegExp(/~(A{1}B?C?(D*|E*|F*|G*)+){1}~/g)

这意味着文档结构可以具有此结构

一个
-B
-D
-D
-D
-D
-D

因此文档结构被解析为~ABDDDDD~

现在我想验证我是否可以在结尾添加“A”,这将导致此字符串:~ABDDDDDA~

这与reg ex不再匹配:

"~ABDDDDDA~".match(regex1)

这确实很安静,但文档结构可以增长,如下所示:~ABDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

匹配值可以快速匹配,但如果值为: 〜ABDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA〜

这需要很长时间,大多数时候我只是关闭浏览器并重新打开它。

有没有人有想法如何解决它?

谢谢!

更新

RegEx还应该涵盖更多,结构可以安静动态。我没有使用过RegEx Generator,这个例子是从自己开发的脚本中解析出来的,只是一个例子。

在这种情况下,有一个根元素A,然后是可选的B或C.现在在一个非给定的顺序中任何数量的D,E,F,G。但至少有一个!

所以它应该对以下内容有效: “〜ABDDDDDFEG〜” “〜AGGGGGEGGD〜” “〜ABCDEFG〜” “〜ABCDDDDDDDDDDDDDDDEFGGGGGG〜”

此外,有可能E限制为0-5次出现。

一旦我使用匹配(A | B),所有浏览器都会出现真正的性能问题。 (IE,Chrome,Firefox)

有什么想法吗?是否有“匹配(A | B)”具有更好性能的替代方案?

1 个答案:

答案 0 :(得分:1)

由此产生的正则表达式应尽可能接近:

~AB?C?[DEFG]*A?~

你的正则表达式生成器有很多简化要做,以摆脱以下几点:

  • {1}:实际上没用,你可以从任何地方删除它
  • (A*|B*)+:严格等同于[AB]*

这是Regex101:https://regex101.com/r/Lc6Fx8/1

此外,如果您需要帮助修复Regex生成器,您应该发布一些有关它的信息。