Регулярное выражение для обозначения символа, перед которым стоит число - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть текст, который иногда заменяет l или I на 1 (это из OCR). Я хочу преобразовать их в 1, когда они являются частью числа, но оставить их в покое, если они стоят одни. Под «частью числа» я подразумеваю соседство с другой цифрой или l или I. Поэтому я хочу изменить 1I3 на 113, но оставить 1 I 3 в покое.

Вот что я делаю:

$var =~ s/[lI](?=[lI\d])/1/g;
$var =~ s/(?<=[lI\d])[lI]/1/g;

Есть ли более элегантный способ сделать это за один шаг? Другими словами, какому регулярному выражению будет соответствовать [Il], то есть или , которому предшествует [lI\d] или , за которым следует [lI\d]?

Ответы [ 2 ]

6 голосов
/ 13 декабря 2011

Вы можете использовать метасимвол чередования |:

$var =~ s/(?<=[lI\d])[lI]|[lI](?=[lI\d])/1/g;

Бедный Ким Чен 11, хотя.

5 голосов
/ 13 декабря 2011

Вы ожидаете, что llla будет преобразовано в 111a?Потому что ваше регулярное выражение также выполняет это преобразование.Проблема, которую вы пытаетесь решить, не зависит от контекста (вы можете вставить число рядом или между потоком [Il], и только тогда вы преобразуете их в 1).Я бы написал цикл на твоем месте.Поправь меня, если я что-то пропустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...