首页 > 解决方案 > 正则表达式 - 从捕获中间排除“1”或“11”

问题描述

我有这个表达式来捕捉季节和它们的年份的文本

(?:WIN\w+|SPR\w+|SUM\w+|FA\w+) \d{4}

我要捕获的典型匹配格式为“FALL 2011”或“SPRING 2019”等,但 Summer 与此格式不同,可以是“Summer 1 2011”或“Summer 11 2011”,如“Summer 1201” '或'1120年夏天'。我希望表达式仍然匹配季节并捕捉年份,但对于 Summer,它需要在捕捉年份之前忽略“1”或“11”。

我试图通过添加一个负前瞻来修改它,以忽略它在一年之前找到的任何“1(空格)”或“11(空格)”模式,因为在大多数情况下,它只会找到由四个连续组成的年份数字,在 Summer 的情况下,它应该找到并跳过 1 或 11,但我的测试表明我修改后的表达式不起作用。我对正则表达式仍然很缺乏经验。

标签: regex

解决方案


你必须在赛季结束后“锚定”到最后四位数。以下是执行此操作的模式:

(SUMMER|FALL|WINTER|SPRING).+?(\d{4})(?=\D|$)

解释:

(SUMMER|FALL|WINTER|SPRING)- 交替,匹配四个季节中的一个并将其存储在第一个捕获组中

.+?- 匹配任何字符的 1+,非贪婪

(\d{4})- 匹配四位数字并将其存储在第二个捕获组中

(?=\D|$)- 正向前瞻,断言后面是非数字\D或字符串结尾$

演示


推荐阅读