2017-02-23 154 views
-1

Скажем, у меня две строки, Hello и heddo, как я могу создать регулярное выражение для соответствия разнице между ними?Regex: подсчет различий между двумя строками

Например, в моем случае есть три отличия, H теперь в нижнем регистре h, и дважды l теперь d.

Или Hello и Text имеет три отличия, TX и T

благодарю вас

+2

Почему буква е слово Hello и текст рассматривается как разница? –

+1

IMHO это не может быть сделано в одном регулярном выражении. Вы должны написать сценарий на своем любимом языке сценариев. – Toto

+0

С регулярным выражением это не может быть сделано, ищет алгоритмы редактирования расстояния или выравнивания –

ответ

1

Это, безусловно, не то, что вы должны делать с регулярными выражениями (если у вас есть веские основания для этого?). Вот, например, решение в Python.

def count_diff(a,b): 
    return sum(x!=y for x,y in zip(a,b)) 

print(count_diff('Hello', 'hebdo')) 

Вы можете попробовать here.

+0

Что будет эквивалент .NET Linq этого? –

+0

@ LukeTO'Brien не знаю. Может быть, тема нового вопроса. –

+1

Это похоже на работу https://dotnetfiddle.net/CplyFr - я приму свой ответ –

1

Regex для Hello является:

^((H)|.)?((e)|.)?((l)|.)?((l)|.)?((o)|.)?$ 

где даже индекс равен следующему (нечетного) элемента, этот символ соответствует.

Match 1 
Full match 0-5 `Hello` 
Group 1. 0-1 `H` 
Group 2. 0-1 `H` 
Group 3. 1-2 `e` 
Group 4. 1-2 `e` 
Group 5. 2-3 `l` 
Group 6. 2-3 `l` 
Group 7. 3-4 `l` 
Group 8. 3-4 `l` 
Group 9. 4-5 `o` 
Group 10. 4-5 `o` 

Full match 0-5 `Heddo` 
Group 1. 0-1 `H` 
Group 2. 0-1 `H` 
Group 3. 1-2 `e` 
Group 4. 1-2 `e` 
Group 5. 2-5 `ddo` 
Group 7. 5-5 `` 
Group 9. 5-5 `` 

или проверить нечетные элементы, Group2,4,6,8 != null -> соответствует

Если REGEX и результаты являются приемлемыми, дайте мне знать, и написать сценарий для этого.

Создать Desire Regex:

var word = "Hello" ; 
 
var myregex = '^' ; 
 
for(i=0;i<word.length;i++){ 
 
\t myregex += '(('+word.substr(i,1)+')|.)?'; 
 
} 
 
myregex += '$'; 
 

 
// Use Regex to find matched Characters and Differences: 
 

 
var mymatch = "Heddo".match(new RegExp(myregex)) ; 
 
mymatch.splice(0,1); 
 
var mismatches = 0 ; 
 
var chars = []; 
 
for(i=1;i<mymatch.length;i+=2){ 
 
\t if(mymatch[i]!==undefined){ 
 
    \t chars.push(mymatch[i]) ; 
 
    }else{ 
 
\t  mismatches++ 
 
    } 
 
} 
 
console.log(mismatches); //Count

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