Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упрощение регулярного выражения 
:(
    Опции темы
antananarivu
Дата 15.10.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Здравствуйте!
У меня есть такое вот регулярное выражение:
Код

$s =~ s/[A-Za-z]/[A-Z]/g;
$s =~ s/[0-9]/[0-9]/g;

То есть любой символ из A-Z или a-z превращается в [A-Z], а любой символ из 0-9 превращается в [0-9].
Как это сделать в одну строчку? Заранее спасибо.
PM MAIL   Вверх
Logo
Дата 15.10.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Код

$s=~s/[$_]/[$_]/gi for 'A-Z','0-9'


Или, еще короче

Код

$s=~s/[$_]/[$_]/gi for<A-Z 0-9>


Это сообщение отредактировал(а) Logo - 15.10.2010, 12:57
PM MAIL   Вверх
antananarivu
Дата 15.10.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Спасибо.
PM MAIL   Вверх
antananarivu
Дата 16.10.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Никак не могу найти как это сделать с помощью регулярного выражения:
удалить первый символ из строки, если он равен А.
PM MAIL   Вверх
antananarivu
Дата 16.10.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Вопрос неактуален. 
Всем спасибо.
PM MAIL   Вверх
MasterOfRegex
Дата 25.10.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2010

Репутация: нет
Всего: нет



Цитата(antananarivu @ 15.10.2010,  11:33)
То есть любой символ из A-Z или a-z превращается в [A-Z], а любой символ из 0-9 превращается в [0-9].
Как это сделать в одну строчку? Заранее спасибо.

Цикл здесь лишний:
Код

$s =~ s/([A-Za-z0-9])/[$1]/g;

Я недавно начал писать углублённые статьи по Perl регулярным выражениям, в основном по своей книжке по Perl regex, и отвечаю на интересные вопросы.

Сергей
PM MAIL   Вверх
Logo
Дата 25.10.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Прогоните на любом тексте ваш код, и увидите, чем отличается результат.
PM MAIL   Вверх
MasterOfRegex
Дата 27.10.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2010

Репутация: нет
Всего: нет



Цитата(Logo @ 25.10.2010,  16:48)
Прогоните на любом тексте ваш код, и увидите, чем отличается результат.

Ой, верно, я неправильно понял условие этой странной задачки... Тогда без вставки кода не обойтись:
Код

$s =~ s/([A-Za-z])|[0-9]/$1 ? "[A-Z]" : "[0-9]"/eg;

PM MAIL   Вверх
Logo
Дата 27.10.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Ага. Но мой код все равно короче.
PM MAIL   Вверх
MasterOfRegex
Дата 28.10.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.10.2010

Репутация: нет
Всего: нет



Да, экономия 11 байтов. :-) А я в книгах по Перлу не видел конструкции типа <A-Z 0-9> и не читал о том, как она работает.
PM MAIL   Вверх
Logo
Дата 28.10.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



См. задачу ТС, его цель сделать как можно короче, однострочник.

Цитата

А я в книгах по Перлу не видел конструкции типа <A-Z 0-9> и не читал о том, как она работает. 

http://perldoc.perl.org/perlop.html#I/O-Operators

PM MAIL   Вверх
KSURi
Дата 28.10.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: нет
Всего: 27



Конструкция <A-Z 0-9> хоть и работает (удивительно), но мягко говоря "не в тему". Тут скорее qw(A-Z 0-9) должно быть.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Logo
Дата 29.10.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

Конструкция <A-Z 0-9> хоть и работает (удивительно), но мягко говоря "не в тему". Тут скорее qw(A-Z 0-9) должно быть. 

Ни чего удивительного. <> В этом случае работает как файловые шаблоны. Т.к. спец символы не используются, он просто возвращает список строк.
qw(A-Z 0-9) тут не дает выигрыша, даже наоборот
Код

$s=~s/[$_]/[$_]/gi for'A-Z','0-9'
$s=~s/[$_]/[$_]/gi for qw(A-Z 0-9)

PM MAIL   Вверх
KSURi
Дата 29.10.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: нет
Всего: 27



Денежный выигрыш?)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Logo
Дата 29.10.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Ты что :o. Азартные игры запрещены. Чисто моральный;)

Добавлено через 1 минуту
ПРОФИТ!
PM MAIL   Вверх
xido
Дата 29.10.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



uc($string)
s/.+/uc($1)/eg;

;)
PM MAIL WWW   Вверх
Logo
Дата 27.12.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Забыл сказать, изначально это был стеб. У ТС уже есть максимально простой способ сделать это, он же и самый быстрый.
Все, что ниже, применять за переделами perlgolf от лукавого есть. Короче по набору символов или строк != проще и понятней.
Поэтому правильный ответ на "Упрощение регулярного выражения" - никак, тут и так максмально просто.
На "Как это сделать в одну строчку" -
Код

$s =~ s/[A-Za-z]/[A-Z]/g; $s =~ s/[0-9]/[0-9]/g;


Ну, можно воспользоватся синтаксическим сахаром - украшательством
Код

for($s) {
  s/[A-Za-z]/[A-Z]/g;
  s/[0-9]/[0-9]/g;
}


или

Код

s/[A-Za-z]/[A-Z]/g, s/[0-9]/[0-9]/g for $s;


суть от этого не меняется.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.