You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]+存在两个关键问题:

  1. [A-z]的范围错误:它包含了ASCII码中Z到a之间的特殊符号(比如[、\等),正确的大小写字母范围应该是[A-Za-z];
  2. +?是非贪婪匹配模式:会尽可能少地匹配字符,当匹配到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:20:23