C ++ 11 Regex search - Исключить пустые совпадения - PullRequest
0 голосов
/ 15 января 2019

Из следующего текста я хочу извлечь number и unit of measurement.

У меня есть 2 возможных случая:

Это какой-то текст 14.56 kg и какой-то другой текст

или

Это некоторый текст kg 14.56 и некоторый другой текст

Я использовал |, чтобы сопоставить оба случая. Моя проблема в том, что он выдает пустые совпадения и, таким образом, дает неверное количество совпадений.

Это мой код:

std::smatch m;
std::string myString = "This is some text kg 14.56 and some other text";

const std::regex myRegex(
        R"(([\d]{0,4}[\.,]*[\d]{1,6})\s+(kilograms?|kg|kilos?)|s+(kilograms?|kg|kilos?)(\s+[\d]{0,4}[\.,]*[\d]{1,6}))",
        std::regex_constants::icase
);

if( std::regex_search(myString, m, myRegex) ){
    std::cout << "Size: " << m.size() << endl;
    for(int i=0; i<m.size(); i++)
        std::cout << m[i].str() << std::endl;
}
else
    std::cout << "Not found!\n";

ВЫВОД:

Size: 5
kg 14.56


kg
14.56

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

WANTED OUTPUT:

Size: 3
kg 14.56
kg
14.56

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

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Используя это регулярное выражение, вам просто нужно содержимое группы 1 и группы 2

((?:kilograms?|kilos?|kg)|(?:\d{0,4}(?:\.\d{1,6})))\s*((?:kilograms?|kilos?|kg)|(?:\d{0,4}(?:\.\d{1,6})))

Нажмите для демонстрации

enter image description here

Пояснение:

  • ((?:kilograms?|kilos?|kg)|(?:\d{0,4}(?:\.\d{1,6})))
    • (?:kilograms?|kilos?|kg) - соответствует kilograms или kilogram или kilos или kilo или kg
    • | - ИЛИ
    • (?:\d{0,4}(?:\.\d{1,6})) - соответствует от 0 до 4 цифр, а затем от 1 до 6 цифр десятичной части
  • \s* - соответствует 0+ пробелов
0 голосов
/ 15 января 2019

Вы можете попробовать это:

((?:(?<!\d)(\d{1,4}(?:[\.,]\d{1,6})?)\s+((?:kilogram|kilos|kg)))|(?:((?:kilogram|kilos|kg))\s+(\d{1,4}(?:[\.,]\d{1,6})?)))

Как показано здесь: https://regex101.com/r/9O99Fz/3

ИСПОЛЬЗОВАНИЕ -

Как я показал в разделе «замещение», чтобы ссылаться на числовую часть количества, вы должны написать $ 2 $ 5 , а для единицы: $ 3 $ 4

Объяснение -

Есть две группы захвата, которые нам могут понадобиться: первая здесь (?:(?<!\d)(\d{1,4}(?:[\.,]\d{1,6})?)\s+((?:kilogram|kilos|kg))) соответствует номеру, за которым следует единица,
а другой (?:((?:kilogram|kilos|kg))\s+(\d{1,4}(?:[\.,]\d{1,6})?)) соответствует единице, за которой следует число

...