2017-04-17 58 views
1

我有两个字符串,通过10改变我的名字正则表达式和运营商重叠匹配

chriscattano 
christiancattano 

我有3个长度字符串的长度,这两个字符串共享

(chr)(hri)(ris)(cat)(att)(tta)(tan)(ano)(chri)(hris)(catt)(atta)(ttan)(tano)(chris)(catta)(attan)(ttano)(cattan)(attano)(cattano) 

我试图把这些成正则表达式搜索,将成功匹配单词chriscattano,以便我可以做一个.replace,并将具有sass类的<span>应用于比赛结果。

如果格式化我的正则表达式为:

/(chr)|(hri)|(ris)|(cat)|(att)|(tta)|(tan)|(ano)|(chri)|(hris)|(catt)|(atta)|(ttan)|(tano)|(chris)|(catta)|(attan)|(ttano)|(cattan)|(attano)|(cattano)/g 

我设法相互匹配chrcattan,但我无法弄清楚如何突出chriscattano;我错过了iso

这个例子可以改变很大,因为我只用我的名字来测试和完善功能。它最终将用于电子邮件地址,名称和地址。所以改变捕获组的顺序(如果这可以解决这个问题的话)并不是一个解决方案,当它变得更加动态化时,我们将无法控制捕获组放入正则表达式对象时的顺序,以及作为参数馈送到.replace()方法。

这里是一个正则表达式,我一直在尝试各种事情来让它突出显示我需要的匹配。希望有人能够鼓励它工作?

http://www.regexpal.com/?fam=97413

+0

您的最终目标是什么?你是否试图编写代码来突出显示两个字符串的常见子字符串?我有一种感觉,正则表达式在这里不是正确的解决方案。 –

+0

@Jordan是的,当给定两个字符串时,我有提取3和10长度之间的所有共享子字符串的代码。想法是那些子字符串然后将被传递给用作.replace()方法中的参数的正则表达式对象ad 。 .replace()方法会用包含指定背景颜色的sass类的span来替换匹配的单词。它看起来与h.replace类似(regexObj,' $ {regexObj}'); – Chris

+0

订单是否重要? 'chriscattano'和'cattanoXYZchris'会产生什么结果?在枚举常用子字符串时有[很多现有工作](https://www.google.com/search?q=algorithm+find+all+common+substrings)。你有一个令人信服的理由重新发明轮子吗? –

回答

1

你需要通过长按降序确保最长的替代方案首先测试,然后将它们加入到与.join("|")模式阵列中的项目进行排序。

这是因为在JS等NFA正则表达式或其他大多数其他类型中,找到的第一个替代方法使正则表达式引擎停止处理该组。你可以在Remember That The Regex Engine Is Eager中阅读更多关于它的内容。