我要从以下文本中提取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
我想要一种简单的方法来提取这两个值,所以我想我想要以下输出:
想要的输出:
Size: 3
kg 14.56
kg
14.56
这样,我总是可以直接提取2nd和3th,但是在这种情况下,我还需要检查哪个是数字。我知道如何通过2个单独的搜索来做到这一点,但是我想以正确的方式做到这一点,而无需使用c ++来检查子匹配是否为空字符串的单个搜索。
答案 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})))
说明:
((?: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+个空格答案 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})?))
与单位匹配,后跟数字