Совпадение двух регулярных выражений в строке - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть этот текст "£ 24 250,00 (включая НДС)"

Я хочу регулярное выражение, которое будет отображать ТОЛЬКО "24250,00"

Мне удалось получить последнюю часть с:

( \(inc\. VAT\))

И отдельно я могу получить £ и с:

[£,]

Но я не могу понять, как объединить оба выражения, чтобы просто вернуть то, что я хочу.

Обратите внимание, что число является динамическим, поэтому оно будет меняться в зависимости от применимых затрат на веб-сайте.

Теоретически я мог бы просто выполнить его через два отдельных регулярных выражения в своем коде c #, каждый из которых обрезал то, что я хочу,Но есть ли способ, которым это можно сделать только одним выражением?

Причина этого в том, что у меня есть метод GetConvertedExtension, который принимает IWebElement, строку (регулярное выражение), а затем преобразует строку в Double, Intи т. д.

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

Я использовал https://regexr.com/ чтобы попытаться получить рабочее решение, но безуспешно и начинаю бороться.

Я использую Visual Studio 2017 и C # с библиотекой Regex

Ответы [ 2 ]

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

(?<currency>[£$€])(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2})\s\(inc\.\sVAT\)

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

В Visual Studio вы:

var regex = new Regex(@"(?<currency>[£$€])(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2})\s\(inc\.\sVAT\)");

Затем вы делаете регулярное выражение (данные) или регулярное выражение (данные) или все, что вам нужно сделать.

Затем, чтобы получить доступ к номеру в вашем совпадении, вам нужно получить доступ к группе значений, чтобы ... match.Groups["value"].Value, где совпадение - это то, что вы назначили своим совпадением с регулярным выражением.

Просто длябыстро пробежаться по регулярному выражению:

(?<currency>[£$€]) это именованная группа захвата, которая будет захватывать £ или $ или буквально.

(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2}) Это называется захватомгруппа, чтобы получить номер.Далее разбиваем:

[0-9]{1,3} соответствует цифре от 0 до 9 от 1 до 3 (включительно) раз.
(?:,[0-9]{3})* соответствует тысячам, разделенным запятыми 0 или более раз.
\.[0-9]{2} соответствует десятичной запятой и двум цифрам после.

\s\(inc\.\sVAT\) Это соответствует буквально бит НДС после номера.Используя \s вместо в качестве пробела, потому что мне легче читать.

ПРИМЕЧАНИЕ: это регулярное выражение работает только для этого числового формата с запятой для каждой тысячи и всегда включает десятичное число.

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

Если вы хотите использовать одно регулярное выражение, вы можете использовать 2 группы захвата:

£(\d+),(\d+\.\d+) \(inc\. VAT\)

Тогда вы можете использовать group1 и group2 друг за другом, чтобы получить свое значение.

Еслидесятичная часть после точки может содержать только 2 цифры, замените последнюю \d+ на \d{2}

Например:

string pattern = @"£(\d+),(\d+\.\d+) \(inc\. VAT\)";
string input = @"£24,250.00 (inc. VAT)";

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Groups[1].Value + m.Groups[2].Value);
}

Результат

24250.00

См. Демонстрационную версию .NET | C # Демо

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