RegEx для захвата двух частей строки - PullRequest
0 голосов
/ 17 февраля 2019

Я собираю некоторые данные.Одним из пунктов данных является призовой фонд турнира.В данных много разных валют.Я хотел бы извлечь сумму и валюту из каждого значения, чтобы я мог использовать Google для преобразования их в базовую валюту.Однако с тех пор, как я использовал регулярные выражения, прошло много времени, поэтому я, по меньшей мере, растерян.Возможные форматы данных:

$534
$22,136.20
3,200,000 Ft HUF
12,500 kr DKK
50,000 kr SEK
$3,800 AUD
$10,000 NZD
€4,500 EUR
¥100,000 CNY
₹7,000,000 INR
R$39,000 BRL

Ниже приведено первое регулярное выражение, которое я придумал.

[0-9,.]+(.+)[A-Z]{3}

Но это, очевидно, незахватить сумму и валюту, поэтому я изменил ее.

([0-9,.]+).+([A-Z]{3})

Однако есть проблемы с этим регулярным выражением, которые я не могу выяснить.

  1. ([0-9,.]+) сам по себе отлично работает для захвата только суммы.

  2. Когда я добавляю .+ к этому выражению, дляпо какой-то причине перестает захватывать конечные 4 и 0 в первом и втором тестовых случаях соответственно. Почему?

  3. Затем, когда я добавляю ([A-Z]{3}), кажется, что он отлично работает для всех тестовых случаев, но, очевидно, ничего не выбирает в первых двух.

  4. Итак, я изменил его на ([A-Z]{0,3}), что, кажется, нарушает все.

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

Вот где я нахожусь: ([0-9,.]+)((?:.+)([A-Z]{3}))?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

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

([0-9,.]+)(?:(?: [A-Za-z]+)? ([A-Z]{3}))?

Regex demo

Это будет соответствовать

  • ( Группа захвата
    • [0-9,.]+ соответствует 1+ раз, что указано в классе символов
  • ) Закрыть группу захвата
  • (?: Группа без захвата
    • (?: [A-Za-z]+ )? Необязательная группа для сопоставления пробела, 1+ раз a-zA-Z и пробела
    • ([A-Z]{3}) Захват 3 заглавных букв
  • )? Закрыть группу без захвата и сделать ее необязательной
0 голосов
/ 17 февраля 2019

Это должно работать:

([0-9,.]+).*?([A-Z]{3})?$

Несколько изменений, которые я сделал:

  • Я изменил .+ на .*?, потому что не всегдачто-то после числа (как первые два случая).Я использовал ленивое сопоставление здесь, потому что иначе оно будет соответствовать всему до конца.

  • Я сделал необязательной группу 2 с ?, потому что не всегда есть валюта (первые 2 случая)

  • Я добавил привязку конца строки $, чтобы ленивый .*? совпадал что-то вместо ничего.

Если вы не знаете, что означает «ленивый» в этом контексте, см. этот пост .

Демо

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