RegEx技术问询:如何排除字符串起始内容提取出生日期
解决正则提取出生日期(排除"b."前缀)的问题
完全不用客气!新手刚接触正则的时候,遇到这类匹配范围的问题太正常了,咱们一步步来解决。
你当前的正则(.+?)(?= -)会从字符串开头开始匹配到" - "为止,所以会把"b. "和后面的出生日期一起抓进来。要排除前面的"b. "前缀,我们可以调整正则,让它从"b. "之后开始匹配:
方案1:使用正向零宽断言定位起始位置
直接用这个正则:
(?<=b\. ).+?(?= -)
解释一下各部分的作用:
(?<=b\. ):这是正向零宽后顾断言,它会检查当前位置的前面是否是b.(注意.在正则里是通配符,所以要加反斜杠\转义成实际的点),但不会把这部分包含在匹配结果里。.+?(?= -):和你原来的逻辑一样,非贪婪匹配任意字符,直到遇到" - "为止((?= -)是正向零宽前瞻断言,同样不包含在结果里)。
用你的示例数据测试,会得到:
- 从
( b. circa 1883 - d. Mar 03, 1960 )中提取出circa 1883 - 从
( b. May 21, 1887 - d. Jan 24, 1979 )中提取出May 21, 1887 - 从
( b. May 28, 1902 Zembin, BELARUS - d. Dec...中提取出May 28, 1902 Zembin, BELARUS
方案2:使用捕获分组(更直观的写法)
如果你觉得断言有点抽象,也可以用捕获分组,直接把想要的内容括起来:
b\. (.+?)(?= -)
这个正则会匹配整个b. circa 1883这样的字符串,但你只需要取第一个捕获分组(也就是括号里的.+?部分)就能得到出生日期。这种写法对新手来说可能更容易理解和调试。
额外小提示
如果"b."后面的空格可能有多个(比如有的地方是b. 两个空格),可以把正则里的空格改成+(匹配一个或多个空格),比如:
(?<=b\. +).+?(?= -)
这样就能应对不同的空格情况啦~
内容的提问来源于stack exchange,提问作者Charles Davidson
相关产品推荐
相关产品推荐

