如何从多行TIF元数据字符串提取SCALE数值?C++正则问题
提取TIF元数据中SCALE值的正则问题
我正在开发一款C++程序,需要从TIF文件读取的元数据字符串中提取SCALE值(示例中为0.5),元数据格式如下:
<GDALMetadata> <Item name="BANDWIDTH"></Item> <Item name="CENTER_FILTER_WAVELENGTH"></Item> <Item name="DATA_SET_ID">&quot;LRO-L-LOLA-4-GDR-V1.0&quot;</Item> <Item name="FILTER_NAME"></Item> <Item name="INSTRUMENT_ID">&quot;LOLA&quot;</Item> <Item name="INSTRUMENT_NAME">&quot;LUNAR ORBITER LASER ALTIMETER&quot;</Item> <Item name="MISSION_NAME"></Item> <Item name="NOTE"></Item> <Item name="PRODUCER_INSTITUTION_NAME">&quot;GODDARD SPACE FLIGHT CENTER&quot;</Item> <Item name="PRODUCT_CREATION_TIME">2017-09-15</Item> <Item name="START_TIME">2009-07-13T17:33:17</Item> <Item name="STOP_TIME">2016-11-29T05:48:19</Item> <Item name="OFFSET" sample="0" role="offset">1737400</Item> <Item name="SCALE" sample="0" role="scale">0.5</Item> </GDALMetadata>
我尝试用以下正则代码实现提取,但未能成功运行:
float scale = 1; std::regex rgx("*<Item name=\"SCALE\"*>(.*?)</Item>*"); std::smatch match; if (std::regex_search(metadata.begin(), metadata.end(), match, rgx)) { scale = static_cast<float>(std::atof(match.str().c_str())); };
问题分析与修正
原正则代码有三个关键错误:
- 开头的
*是无效语法:正则中*是量词,不能单独作为匹配开头,需要用[^>]*匹配标签内的其他属性 - 未正确捕获目标值:
match.str()返回的是整个匹配的字符串,而非我们需要的SCALE数值,应该用捕获组match[1].str() - 正则匹配逻辑不严谨:原正则无法正确匹配带有额外属性的
<Item>标签
修正后的代码如下:
float scale = 1.0f; // 使用原始字符串字面量避免转义,正则匹配SCALE对应的Item标签并捕获数值 std::regex rgx(R"(<Item name="SCALE"[^>]*>(.*?)</Item>)"); std::smatch match; if (std::regex_search(metadata, match, rgx)) { // 用std::stof直接转换捕获组内容为float,更符合C++风格 scale = std::stof(match[1].str()); }
正则说明
<Item name="SCALE":精准定位到SCALE对应的Item标签开头[^>]*:匹配标签内的任意额外属性(比如sample="0" role="scale"),[^>]表示匹配除>外的任意字符,*表示匹配任意次数(.*?):非贪婪捕获标签内的数值内容,避免误匹配到其他标签</Item>:匹配标签结尾
内容的提问来源于stack exchange,提问作者Chris Gnam
相关产品推荐
相关产品推荐

