2015-06-09 34 views
0

我需要一個RegEx來檢查我是否可以在字符串中找到一個表達式。正則表達式不重複

對於字符串「abc」,我想匹配沒有重複的任何排列的第一次出現,在這種情況下是6:abc,acb,bac,bca,cab,cba。

例如,在此字符串「adesfecabefgswaswabdcbaes」它會找到一個巧合中的位置7

而且我需要的排列一樣不喜歡這個「ABBC」重複。造成這種情況的案例是12:ACBB,ABCB,ABBC,CABB,CBAB,CBBA,BACB,BABC,bcab,BCBA,BBAC,豐原

例如,在此字符串 「adbbcacssesfecabefgswaswabdcbaes」 它會找到一個巧合的位置3.

另外,我想知道如何將類似的情況下。我不是在尋找排列組合,沒有。我已經有這些。我正在尋找的是一種檢查這些排列是否在給定字符串中的方法。

EDIT 2 此正則表達式我想介紹我的第一個問題 ([ABC])([ABC])(\ 1?!)(\ 2 |!\ 1)[ABC]

能找到在任何字符串中「abc」的所有排列(6)。

現在我需要做同樣的事情,當我有像abbc(12組合)重複的字符。

+0

無限集的排列而不重複不是一種常規語言。正則表達式是錯誤的工具。 – Bergi

+0

沒有正則表達式運算符來表示「字符串的排列」。你必須計算它們來構建該正則表達式。 – 1010

+0

感謝您的回答,我已經有一個程序創建所有的排列,事實上我確實有這些組合。我需要的是必須檢查這些組合中是否有超過200萬個字符串,我需要檢查巧合...這就是我認爲正則表達式可能是一個好的解決方案的原因 –

回答

0

你可能「需要一個正則表達式」的唯一理由是,如果你是一個庫或工具,只允許指定特定類型的規則,正則表達式的工作。例如,一些編輯器可以被定製爲以特定的方式給某些語法結構着色,並且它們只允許那些結構被指定爲正則表達式。

否則,你不需要「正則表達式」,你「需要一個程序」。這裏有一個:

// are two arrays equal? 
function array_equal(a1, a2) { 
    return a1.every(function(chr, i) { return chr === a2[i]; }); 
} 

// are two strings permutations of each other? 
function is_permutation(s1, s2) { 
    return array_equal(s1.split('').sort(), s2.split('').sort()); 
} 

// make a function which finds permutations in a string 
function make_permutation_finder(chars) { 
    var len = chars.length; 
    return function(str) { 
    for (i = 0; i < str.length - len; i++) { 
     if (is_permutation(chars, str.slice(i, i+len))) return i; 
    } 
    return -1; 
    }; 
} 

> finder = make_permutation_finder("abc"); 
> console.log(finder("adesfecabefgswaswabdcbaes")); 
< 6 

正則表達式遠不足以做到這一點。

但是,有一個替代方案,它預先計算排列並構建一個動態正則表達式來查找它們。你沒有提供語言標籤,但這裏有一個JS例子。假設你有排列,不必擔心逃脫特殊的正則表達式字符,這只是

regexp = new RegExp(permuations.join('|')); 
+1

感謝答案是,我已經有一個創建所有排列的程序,實際上我有這些組合。我需要的是必須檢查這些組合中是否有超過200萬個字符串,我需要檢查巧合......這就是我認爲正則表達式可能是一個很好的解決方案的原因 –