正则匹配提取map_Ks对应的文件路径能否不用捕获组直接获取目标值?
正则无捕获组提取指定前缀后的路径问题解答
原始需求
期望不使用捕获组,而是通过断言字符串的首尾匹配规则,直接获取正则匹配到的目标值。
待匹配输入示例
map_Ks ./CarbonFiber_T.tga
输入格式定义
- 行首
- 可选任意空格
- 固定字符串
map_Ks(这是要赋值的类字段) - 1个及以上空格
- 合法文件路径,字符范围排除0x00-0x1F、0x7C(这是要提取的字段赋值内容)
- 可选任意空格
- 行尾
原有尝试方案
尝试1
可正常匹配,但目标值在捕获组中,正则写法:(?:^\s+map_K.\s+)([^\x00-\x1F\x7C]+)$
匹配结果:
map_Ks ./CarbonFiber_T.tga ./CarbonFiber_T.tga
尝试2
无捕获组,但匹配结果为整行内容,正则写法:(?=^\s+map_K.\s+)[^\x00-\x1F\x7C]+$
匹配结果:
map_Ks ./CarbonFiber_T.tga
解答
你的需求可以实现,只需要搭配使用零宽后发断言和零宽先发断言即可,不需要捕获组。
如果你的运行环境使用的正则引擎支持可变长度后发断言(.NET、Python 3.10+、Java 9+、PHP 7.3+等主流高版本运行环境均支持),可以直接使用以下正则:
(?<=^\s*map_Ks\s+)[^\x00-\x1F\x7C]+(?=\s*$)
写法说明
(?<=^\s*map_Ks\s+)是正向零宽后发断言,会校验前缀是否符合「行首+任意空格+固定字符串map_Ks+1个及以上空格」的规则,该部分不会计入最终匹配结果[^\x00-\x1F\x7C]+是你要提取的合法文件路径,这部分会作为唯一的匹配结果返回(?=\s*$)是正向零宽先发断言,会校验后缀是否符合「任意空格+行尾」的规则,该部分也不会计入最终匹配结果
如果你使用的正则引擎仅支持固定长度后发断言,那么使用捕获组是兼容性最好、可读性最高的方案,无需刻意追求无捕获组的写法。
内容的提问来源于stack exchange,提问作者aybe
相关产品推荐
相关产品推荐

