让我首先说明 regexp 可能不是最好的工具。由于字符串具有简单的格式,您知道将字符串解析为标记然后比较标记会更快、更安全。
但是您可以使用 Regexp 执行此操作,尽管在 javascript 中您会因缺乏后视而受到阻碍。
执行此操作的方法是使用负前瞻来防止包含在其他字符串中的匹配项。但是,由于 javascript 不支持后向搜索,您可能需要从两个方向进行搜索。
我们通过使用可以测试的分隔符连接字符串来做到这一点。
如果使用'|'作为分隔符,正则表达式变为;
/(\D\d*)(?=(?:\||\D.*\|))(?!.*\|(.*\d)?\1(\D|$))/g
在第二个字符串中查找第一个字符串中不存在的标记;
var bothstring=str2.concat("|",str1);
var re=/(\D\d*)(?=(?:\||\D.*\|))(?!.*\|(.*\d)?\1(\D|$))/g;
var match=re.exec(bothstring);
对 re.exec 的后续调用将返回以后的匹配项。所以你可以像下面的例子那样遍历它们;
while (match!=null){
alert("\""+match+"\" At position "+match.index);
match=re.exec(t);
}
如上所述,这在 str2 中给出了与 str1 不同的标记。要获取 str1 中不同的标记,请使用相同的代码,但在连接字符串时更改 str1 和 str2 的顺序。
如果处理潜在的脏输入,上面的代码可能不安全。特别是如果提供像“A100|A100”这样的字符串可能会出现异常行为,第一个 A100 不会被视为缺少对象,因为正则表达式不知道源应该是两个不同的字符串。如果这是一个潜在问题,则搜索分隔符的出现。