如何检查2个正则表达式是不是相同的会计语法差异?
Posted
技术标签:
【中文标题】如何检查2个正则表达式是不是相同的会计语法差异?【英文标题】:How to check whether 2 regexp are the same accounting syntax differences?如何检查2个正则表达式是否相同的会计语法差异? 【发布时间】:2020-01-15 09:30:43 【问题描述】:我正在将一个相当大的 RegExp 重构为一个返回 RegExp 的函数。作为向后兼容性测试,我将返回的 RegExp 的 .source
与旧 RegExp 的 .source
进行了比较:
getRegExp(/* in the case requiring backward compatibility there's no arguments */)
.source == oldRegExp.source
但是,我注意到旧的 RegExp 包含各种过多的反斜杠,例如 [\.\w]
而不是 [.\w]
。我想重构这些位,但其中有很多,并且进行类似的检查会很好(向后兼容性不会被破坏)。问题是,/[\.\w]/.source != /[.\w]/.source
。并且识别哪些反斜杠可以被自动删除并非易事(\.
和 .
在 [...]
之外并不相同,在某些其他情况下可能不同)。
您知道一些简单的方法吗?看来这只能通过.source
的实际解析来完成(将上面的示例与/\[\.\w]\/
和/\[.\w]\/
进行比较),但可能是我错过了利用浏览器内置属性/方法的一些技巧。关键是,'\"' == '"'
是真的,所以用这些不同语法定义的字符串被存储为“标准化”值("
),我想知道这种“标准化”模式是否可用于 RegExp。
【问题讨论】:
@ggorlen 你能解释一下[.\w]
与[\.\w]
的不同之处吗?请参阅***.com/a/19976308/3995261 (regular-expressions.info/refcharclass.html)。是的,反斜杠过多
哦,谢谢,我没有意识到这一点。这是another thread,它有有用的资源,可能比上面的链接更好。正如克里斯在下面提到的,我认为证明两个正则表达式等价可能会减少到halting problem。
@ggorlen 好吧,不完全是。考虑 '\"' == '"'
为真:这些是用不同语法定义的相同字符串值 ("
)。我想知道 RegExp 是否有类似的“标准化”表示,它可以在本地使用并且可以进行比较(可惜.source
没有)。
【参考方案1】:
遗憾的是,比较两个正则表达式以查看它们是否相同与比较任何其他两段代码完全相同 - 即,很难。
我所知道的唯一真正的方法是创建一套测试,每个测试都针对正则表达式的特定方面并验证它是否正常工作。这不是一个简单的过程——正则表达式微妙而复杂,有很多潜在的未实现的副作用。我最近不得不修复基于正则表达式的地址解析器中的一些缺陷,并且在我对我的覆盖范围感到满意之前进行了大约一千次单元测试......但是当我开始更改正则表达式时我的测试不断地抓东西!!
单元测试很糟糕,而且很累而且不好玩,但对于几乎任何逻辑,它都有真正的价值,当使用像正则表达式这样强大的工具时,我会说它绝对是至关重要的。
【讨论】:
是的,我也在考虑测试(实际上,我已经有很多测试了),就像你提到的那样,由于“未知”覆盖率而缺乏信心以上是关于如何检查2个正则表达式是不是相同的会计语法差异?的主要内容,如果未能解决你的问题,请参考以下文章