2015-09-17 7 views
2

Как сделать «нечеткий поиск» регулярным выражением?Нечеткое совпадение по регулярному выражению

Например, текст "HP ноутбук" может быть нечетким соответствием для любого из:

xxx hp laptop 
hp xxx laptop 
laptop xxxxx hp 
+1

Try '\ л.с \ Ь * \ blaptop \ Ь |.?. \ Blaptop \ б * \ л.с \ b'?. Но, похоже, это выглядит не очень хорошо. –

ответ

1

использование просмотрового-aheads для каждого слова:

(?=.*\bhp\b)(?=.*\blaptop\b).* 

\b означает "краевое слово" , поэтому "bhp" и "laptops" не совпадают.

См. live demo.

Взгляд вперед, который имеет форму (?=...), утверждает (но не потребляет), что вход соответствует регулярному выражению (точки ... в этом примере). Поскольку он не потребляет вход, указатель не продвигается, когда он оценивается, поэтому вы можете иметь несколько опережающих перспектив в одной и той же точке.

Прочтите this для более подробного объяснения.

Используйте как можно больше из этих перспектив, поскольку у вас есть слова в вашем поисковом запросе.

+0

Я должен предоставить якорь. –

+0

Мне стыдно признаться, что я никогда не слышал о перспективах в регулярном выражении. Классная вещь. – Amarnasan

+0

awesome .. как я могу переписать это в случае, если строка является переменными? – user1902849

2

Я бы предложил протестировать /\bhp\b/ig и /\blaptop\b/ig отдельно, если сначала проходит, то проверьте второе, это самый простой способ.

Это /(\bhp\b).*(\blaptop\b)|(\blaptop\b).*(\bhp\b)/gi будет полезно проверить, есть ли в строке также слова «hp» и «laptop», но это не очень гибко.

Необходимо использовать границы слов \b в другом, чтобы избежать «флешпота» и hpaptop и так далее.

test

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