Perl Regex (\ d * \. \ D {2}) - PullRequest
       21

Perl Regex (\ d * \. \ D {2})

0 голосов
/ 17 января 2012

Я столкнулся с регулярным выражением в Perl, которое, похоже, вызывает у меня проблемы.Я довольно новичок в Perl - но я не думаю, что это моя проблема.

Вот код:

if ($line =~ m/<amount>(\d*\.\d{2})<\//) { $amount = $1; }

Я по сути разбираю файл в формате XML для одноготег.Вот конкретное значение, которое я пытаюсь проанализировать.

<amount>23.00000</amount>

Может кто-нибудь объяснить, почему мое регулярное выражение не будет работать?

РЕДАКТИРОВАТЬ: я должен упомянуть, что я пытаюсьимпортировать сумму в качестве значения валюты.Конечные 3 десятичных знака бесполезны.

Ответы [ 3 ]

5 голосов
/ 17 января 2012

Фрагмент \d*\.\d{2} regex распознает только число с ровно двумя десятичными разрядами.Ваш образец имеет пять десятичных разрядов и поэтому не соответствует этому фрагменту.

Вы хотите использовать \d*\.\d+, если вам нужно хотя бы одно десятичное место, или \d*\.\d{2,5}, если вы можете иметь от 2 до5 десятичных разрядов.

И вам не следует использовать символы обратного тика в вашем регулярном выражении, поскольку они не имеют значения в регулярном выражении и, следовательно, интерпретируются как обычный символ.

Поэтому вы хотите использовать:

if ($line =~ m/<amount>(\d*\.\d{2,5})<\/amount>/) { $amount = $1; }
5 голосов
/ 17 января 2012

Вы не должны использовать регулярные выражения для разбора HTML , но независимо от этого это исправит:

if ($line =~ m|<amount>(\d*\.\d{2})\d*<//)| { $amount = $1; }
0 голосов
/ 22 января 2012

В шаблоне регулярных выражений последовательность "{2}" означает совпадение точно двух экземпляров предыдущего шаблона.

Таким образом, \ d {2} будет соответствовать только двум цифрам, тогда как ваш входной текст имел пять цифр на этом этапе.

Если вам не нужны завершающие цифры, вы можете удалить их, используя \ d * вне скобок для захвата.

Кроме того, если ваш шаблон содержит косые черты, попробуйте использовать другой разделитель, чтобы избежать экранирования, например

if ($line =~ m{<amount>(\d*\.\d{2})\d*</}) { $amount = $1; }

Кроме того, если вы хотите проанализировать XML, вы можете рассмотреть возможность использования библиотеки XML, такой как XML :: LibXML .

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