2015-06-09 2 views
0

Мне нужен RegEx, чтобы проверить, могу ли я найти выражение в строке.Перестановки регулярных выражений без повторения

Для строки «abc» я хотел бы соответствовать первому появлению любой из перестановок без повторения, в данном случае 6: abc, acb, bac, bca, cab, cba.

Например, в этой строке «adesfecabefgswaswabdcbaes» было бы найти совпадение в положении 7.

Также мне нужно то же самое для перестановок без повторений, как это «Абы». Случаи для этого 12: ACBB, ABCB, Аббв, CABB, cbab, cbba, bacb, В.А.В.С., bcab, bcba, BBAC, BBCA

Например, в этой строке "adbbcacssesfecabefgswaswabdcbaes" было бы найти совпадение в положение 3.

Кроме того, я хотел бы знать, как это было бы для подобных случаев.

EDIT Я не ищу комбинацию перестановок, нет. У меня уже есть такие. Что я ищу - это способ проверить, есть ли какая-либо из этих перестановок в заданной строке.

EDIT 2 Это регулярное выражение я думаю, что покрывает мой первый вопрос ([а]) ([а]) (\ 1?!) (\ 2 |?! \ 1) [а]

может найти все подстановки (6) «abc» в любой последовательности символов.

Теперь мне нужно сделать то же самое, когда у меня есть повторяющийся символ, такой как abbc (12 комбинаций).

+0

Перестановки бесконечного множества без повторений не являются регулярным языком. Regex - неправильный инструмент. – Bergi

+0

не существует оператора регулярных выражений для представления «перестановок строки». вам придется вычислить их для создания этого регулярного выражения. – 1010

+0

Спасибо за ответ, у меня уже есть программа, которая создает все перестановки, на самом деле у меня есть эти комбинации.Мне нужно, чтобы проверить, есть ли какая-либо из этих комбинаций в более чем 2 миллионах строк, мне нужно проверить совпадения ... вот почему я думал, что регулярное выражение может быть хорошим решением. –

ответ

0
([abc])(?!\1)([abc])(?!\2|\1)[abc] 

Вы можете использовать это без g флага, чтобы получить позицию position.See demo.The первой группы является то, что вы хотите.

https://regex101.com/r/nS2lT4/41

https://regex101.com/r/nS2lT4/42

+0

Это не может быть обобщено .. и это не подходит для ' [abbc] ' –

+0

Теперь он не работает для' aba'. – Paulpro

+0

@vks Я имел в виду второй случай OP.: P –

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 

Regexps далеко не достаточно мощные, чтобы делать подобные вещи.

Однако есть альтернатива, которая предкоммутирует перестановки и создает динамическое регулярное выражение для их поиска. Вы не указали языковой тег, но вот пример в JS. Если у вас есть перестановки и не придется беспокоиться о побеге при помощи специальных символов, это просто

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

Спасибо за ответ, у меня уже есть программа, которая создает все перестановки, на самом деле у меня есть эти комбинации. Мне нужно, чтобы проверить, есть ли какая-либо из этих комбинаций в количестве более 2 миллионов строк, мне нужно проверить совпадения ... вот почему я думал, что регулярное выражение может быть хорошим решением –

Смежные вопросы