Что нового

[RegExp] Регулярка для удаления лишних символов

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Не могу сообразить с регулярным выражением, которое оставит из строки только:
1. Русские буквы
2.Цифры
3. Английские буквы
4. Знаки: Подчеркивания, тире, одиночная и двойная кавычки
И заменяло все остальное пробелом.
Примеры строк:
Код:
★••• Spez•••★ - ♫Давай танцуй (Alors on Dance Cover)♫
???•?Pra(KillaGramm)?•??? - Без вины виноватый
Noize MC¦ - - Помни я тебя люблю¦
¦ Noize MC feat. Anacondaz - ********
?[ Apocalyptica - Quutamo ]?
?•?•AMATORY the Sky is Red - Пырышки-пупырышки?•?•
Teodor DJ's - 08. Stylemasters - Hustlah

P.S. Даже форум не все воспринимает...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
StringRegExpReplace($sText, '[^\w,\x2D,А-Я,а-я,/_,/''/"]', ' ')


OffTopic:
Убрал некоторые нехорошие слова.
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Спасибо Yashied - понял смысл.
Забыл что мне еще скобки, точки, буква ё, и диезы нужны =)
Код:
StringRegExpReplace($sText, '[^\w,#,ё,\(,\),\.,\x2D,А-Я,а-я,/_,/''/"]', ' ')
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Зачем Все подряд экранировать и отделять запятыми :
Ведь достаточно сделать так :
Код:
$sText = "#cs"  & @CRLF & _ 
"?••• Spez•••? - dДавай танцуй (Alors on Dance Cover)d"  & @CRLF & _ 
"???•?Pra(KillaGramm)?•??? - Без вины виноватый"  & @CRLF & _ 
"Noize MC¦ - - Помни я тебя люблю¦"  & @CRLF & _ 
"¦ Noize MC feat. Anacondaz - ********"  & @CRLF & _ 
"?[ Apocalyptica - Quutamo ]?"  & @CRLF & _ 
"?•?•AMATORY the Sky is Red - Пырышки-пупырышки?•?•"  & @CRLF & _ 
"Teodor DJ's - 08. Stylemasters - Hustlah"  & @CRLF & _ 
"#().-_'"""  & @CRLF & _ 
"#ce"

;$sPatern = "[^а-ёЁ-Я\w()'""#-]"
;$sPatern = "[^а-ёЁ-Я\w()'""#\r\n-]" ; переносы строк были зыбыты
$sPatern = "[^А-яЁё\w()'""#\r\n-]"
$sResult = StringRegExpReplace( $sText, $sPatern, ' ' )
MsgBox(4096, ' Test Result', $sResult)


Примечание :
Символ "-" должен стоять последним в шаблоне, иначе экранируем ( "\-" )


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

Перенести бы тему...
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Русский диапазон можно и так задать Ё-ё, но как я выяснил это неправильно.

Вот пример доказывающий это:
Код:
$text = ""
For $i = 33 to 255
    $text = $text & Chr($i)
Next
$text=StringRegExpReplace($text, '[^А-яЁё]', '') ; самый правильный вариант
; $text=StringRegExpReplace($text, '[^Ё-ё]', '')
; $text=StringRegExpReplace($text, '[^а-ёЁ-Я]', '')
MsgBox(0, "Алфавит из букв", $text)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
$text=StringRegExpReplace($text, '[^А-яЁё]', '') ; самый правильный вариант

Возможно ты и прав.
Хотя для обычного текста (клавиатурные символы) вполне соответствует и : [^а-ёЁ-Я]'
Код:
$Text = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'& _ 
	'QWERTYUIOP[]\ASDFGHJKL;''ZXCVBNM,./qwertyuiop[]\asdfghjkl;''zxcvbnm,./' & _ 
	'1234567890-=!@#$%^&*()_+!"№;%:?*()_+'
$text=StringRegExpReplace($text, '[^а-ёЁ-Я]', '')
MsgBox(0, "Алфавит из букв", $text)

Кстати эту инфу взял из : http://autoit-script.ru/index.php/topic,4901.0.html от Redline

Все же согласен. Убедил. Недопустимо для рег.выражений оставлять вероятность попадания посторонних символов.
Теперь буду использовать только : [А-яЁё]
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Мне даже самому стало интересно посмотреть на общий диапазон, откуда он берётся, я какое то время считал, что этот диапазон соответствует коду символа, но если бы это было так, то [Ё-ё] не должен захватить русские буквы, так как Ё=168, ё=184 А=192, я=255 и в диапазон между 168-184 не входит 192-255 (в юникоде также).


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

Благодаря новой фиче в RegExp - просмотр захвата символов указанного диапазона удалось понять как работает [А-яЁё] и [Ё-ё]. Оказывается эти диапазоны работают не в символах с кодом 0-255, а в юникоде. Эту таблицу можно посмотреть запустив charmap.exe и включить режим "Юникод". Кстати, ещё заметил что восмеричный и шестнадцатеричный код работает от 0 до 127 символа, а если брать диапазон шире, то он уже работает в юникоде.
 
Верх