C++正则表达式无法识别单词末尾的点问题求助
正则匹配问题求解
问题背景
我尝试用以下正则表达式从文件中读取一行内容:
^([A-z.]+?\s?[A-z]+)\s([A-z]+)\s(\d{7})\s(\d?\d.\d)$
待匹配的行内容为:
W.W. Sneijder 0000574 10.0
我的意图是让包含a-z、A-Z或点的单词匹配[A-z.]+部分,但这个正则无法识别W.W.中的第二个点。我原本以为方括号加+会匹配括号内任意字符直到遇到空格,现在找到了一个可行但不够优雅的表达式:
^([A-z.]+[.\s?[A-z]+)\s([A-z]+)\s(\d{7})\s(\d?\d.\d)$
希望得到更优雅的解决方案。
问题分析与解决方案
问题根源
原正则里的[A-z.]+?\s?[A-z]+存在两个关键问题:
[A-z]的范围错误:它包含了ASCII码中Z到a之间的特殊符号(比如[、\等),正确的大小写字母范围应该是[A-Za-z];+?是非贪婪匹配模式:会尽可能少地匹配字符,当匹配到W.W后,后面的\s?[A-z]+会尝试匹配字母,但W.W.后面只有空格,导致第二个点被遗漏。
优雅的正则写法
直接用[A-Za-z.]+匹配连续的字母/点组合,直到遇到第一个空格,修正后的完整正则如下:
^([A-Za-z.]+)\s([A-Za-z]+)\s(\d{7})\s(\d{1,2}\.\d)$
额外优化细节:
- 把
\d?\d改为\d{1,2},语义更清晰,明确匹配1-2位数字; - 把
.转义为\.,避免它被当作“匹配任意字符”的通配符,确保只匹配实际的点符号。
测试这个正则可以完美匹配目标行:第一组捕获W.W.,第二组捕获Sneijder,第三组捕获0000574,第四组捕获10.0。
内容的提问来源于stack exchange,提问作者terrortinus
相关产品推荐
相关产品推荐

