Что нового

[RegExp] Поиск строки в тексте независимо от порядка слов в строке

Naisho

Знающий
Сообщения
86
Репутация
12
Имеется некий текст. Нужно определить содержит ли он определённую строку при условии, что составляющие строку слова идут в произвольном порядке и что эти слова отстоят друг от друга не более чем на один символ.
Строка от одного слова и более, без учёта регистра и с возможностью прожевать юникод. Нужен только факт наличия строки в тексте.

строка : "Мама мыла раму"
Должна находиться в случае:
Мама мыла раму
раму мыла мама
мыла раму мама
и т.д.
Не должна находиться в случае
Мама мыла белую раму
Мама с папой мыла раму
и т.д.

и второй случай - составляющие строку слова идут в произвольном порядке и отстоят на произвольное количество символов (должно найтись и то, что не нашлось в первом случае.

Основное что непонятно - как реализовать произвольность порядка слов - с фиксированным проблем нет
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Слова разделены только пробелами?
 
Автор
N

Naisho

Знающий
Сообщения
86
Репутация
12
В общем да, хотя в тексте богут быть знаки препинания. А в поисковой строке - только пробелы.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Naisho

Код:
#include <Array.au3>

; 1-й вариант
$sTring = 'Мама мыла раму'
$sText = 'dvnjkm Мама, мыла !раму fhmklg'
$sText = StringRegExpReplace($sText, '[[:punct:]]', '')

$aArray = StringSplit($sTring, ' ')
_ArrayDelete($aArray, 0)
$aNewArray = _ArrayPermute($aArray, ' ') 
$sPattern = _ArrayToString($aNewArray, '|', 1)
;_ArrayDisplay($aNewArray)
$s = StringRegExp($sText, $sPattern, 0) ; 1 - есть, 0 - нет

ConsoleWrite($s & @CRLF)

; 2-й вариант
$sTring = 'Мама мыла раму'
$sText = 'Мама плохо мыла белую раму'
$sText = StringRegExpReplace($sText, '[[:punct:]]', '')

$aArray = StringSplit($sTring, ' ')
_ArrayDelete($aArray, 0)
$aNewArray = _ArrayPermute($aArray, '.*?') 
$sPattern = _ArrayToString($aNewArray, '|', 1)

;_ArrayDisplay($aNewArray)
$s = StringRegExp($sText, $sPattern, 0) ; 1 - есть, 0 - нет  

ConsoleWrite($s & @CRLF)


Вроде работает, но с _ArrayPermute какой-то глюк - обрезает символы-разделители...
 
Верх