C ++ 11正则表达式搜索-排除空子匹配项

时间:2019-01-15 04:57:28

标签: regex c++11 regex-group

我要从以下文本中提取numberunit 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

我想要一种简单的方法来提取这两个值,所以我想我想要以下输出:

想要的输出:

Size: 3
kg 14.56
kg
14.56

这样,我总是可以直接提取2nd和3th,但是在这种情况下,我还需要检查哪个是数字。我知道如何通过2个单独的搜索来做到这一点,但是我想以正确的方式做到这一点,而无需使用c ++来检查子匹配是否为空字符串的单个搜索。

2 个答案:

答案 0 :(得分:2)

使用此正则表达式,您只需要Group 1和Group 2的内容

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

Click for Demo

enter image description here

说明:

  • ((?:kilograms?|kilos?|kg)|(?:\d{0,4}(?:\.\d{1,6})))
    • (?:kilograms?|kilos?|kg)-匹配kilogramskilogramkiloskilokg
    • |-或
    • (?:\d{0,4}(?:\.\d{1,6}))-匹配0到4位数字,后跟1到6位小数部分
  • \s*-匹配0+个空格

答案 1 :(得分:1)

您可以尝试一下:

((?:(?<!\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})?))与单位匹配,后跟数字