Что нового

Поиск без учета регистра. AutoIt не распознает русский язык в рег. выражениях

Suppir

Продвинутый
Сообщения
967
Репутация
62
Код:
$line = "Постановление Главы администрации"
$sin = "Постановление главы администрации"

If StringRegExp($line, "(?i)" & $sin) Then ConsoleWrite(1)


Почему-то не работает.



Добавлено:
Сообщение автоматически объединено:

Так тоже не работает:

Код:
If StringRegExp($line, "(?i:" & $sin & ")") Then ConsoleWrite(1)



Добавлено:
Сообщение автоматически объединено:

Я понял - AutoIt не распознает русский язык :(
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Поиск без учета регистра. AutoIt не распознает русский язык

Suppir [?]
Я понял - AutoIt не распознает русский язык

AutoIt то распознает русский язык , но в Рег Выражениях "(?i)" на русский текст недействует
Можно Так :

Код:
If StringRegExp(StringLower ( $line ) , "(?i)" & StringLower (  $sin)) Then ConsoleWrite(1)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Поиск без учета регистра. AutoIt не распознает русский язык

gregaz, я так сравниваю в некоторых случаях, но это не идеальный выход.

Я так понял, строку нужно перекодировать в UNICODE, перед тем как засовывать в регулярное выражение. Но вот такой код тоже не действует:


Код:
$line = "Постановление Главы администрации"
$sin = "Постановление главы администрации"

If StringRegExp($line, "(?i)" & _StringToUTF8($sin)) Then ConsoleWrite(1)


Func _StringToUTF8($sString)
	Local $Result = "", $Code
	Local $VarUTFArr = StringSplit($sString, "")
	
	For $i = 1 To $VarUTFArr[0]
		$Code = Asc($VarUTFArr[$i])
		
		Select
			Case $Code >= 192 And $Code <= 239
				$VarUTFArr[$i] = Chr(208) & Chr($Code - 48)
			Case $Code >= 240 And $Code <= 255
				$VarUTFArr[$i] = Chr(209) & Chr($Code - 112)
			Case $Code = 168
				$VarUTFArr[$i] = Chr(208) & Chr(129)
			Case $Code = 184
				$VarUTFArr[$i] = Chr(209) & Chr(145)
			Case Else
				$VarUTFArr[$i] = Chr($Code)
		EndSelect
		
		$Result &= $VarUTFArr[$i]
	Next
	
	Return $Result
EndFunc





Добавлено:
Сообщение автоматически объединено:

Самое смешное, что вне регулярных выражений русский текст нормально определяется:

Код:
$line = "Постановление Главы администрации"
$sin = "Постановление главы администрации"

If StringInStr($line, $sin) Then ConsoleWrite(1)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Поиск без учета регистра. AutoIt не распознает русский язык

Suppir [?]
Самое смешное, что вне регулярных выражений русский текст нормально определяется:

Да наверное "(?i)" выполняет перекодировку в строчные буквы , но только для латиницы.
Все равно где то надо переводить в строчные буквы ,так почему не StringLower
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Поиск без учета регистра. AutoIt не распознает русский язык

gregaz, вот эта строчка - самая медленная часть моего скрипта:

Код:
if StringRegExpReplace(StringLower($kon[$x]), "\s{2,}", "") = StringRegExpReplace(StringLower($gar[$i]), "\s{2,}", "") Then


Медленно этот StringLower делается.

Хорошо, знатоки. Давайте отложим версию со StringLower. Какие еще есть средства заставить работать русские буквы в регулярных выражениях?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Поиск без учета регистра. AutoIt не распознает русский язык

Suppir
У меня так работает с русскими буквами:
Код:
$line = "Постановление Главы администрации"
$sin = "Постановление главы администрации"

MsgBox(0, "", StringRegExp(StringLower($line), StringLower($sin)))
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Поиск без учета регистра. AutoIt не распознает русский язык

Русски буквы в регулярных выражениях по-любому нужны.

Попробуйте, например, код:

Код:
$line = "Постановление Главы администрации"
$line2 = "Postanovlenie glavi administracii"

$Matches = StringRegExp($line, "\w+", 3)
if @error = 0 Then ConsoleWrite($Matches[1])

$Matches = StringRegExp($line2, "\w+", 3)
if @error = 0 Then ConsoleWrite($Matches[1])



Будет печататься только из $line2.
Здесь вам StringLower не поможет.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
gregaz, смешно :D

Мне кажется, проблема в кодировке строки.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
В Perl русские буквы работают в регулярных выражения. Достаточно прописать locale

[А-Яа-я] будет работать только для кодировки cp1251. Для KOI8_R этот прием не годится (там русские буквы не по порядку). Для юникодовых не знаю, вопрос открытый.

Имхо, должен быть способ заставить работать PCRE с русскими буквами как с родными.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles, я в третьем посте привел оттуда функцию.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Код:
#Include <FileOperations.au3>

$sText = 'привет'
$sSearch = 'пРи'
$sSearch = __FO_UserLocale($sSearch, 'А-яЁё')

MsgBox(0, $sSearch, StringRegExp($sText, $sSearch))


Скорость поиска не пострадала.
 
Верх