2017-04-17 59 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中閱讀更多關於它的內容。