Regex 可以在正则表达式中对组求反吗?

Regex 可以在正则表达式中对组求反吗?,regex,Regex,假设我们有这样一个文本: 2020-09-29 2020-09-30 2020-10-01 2020-10-02 2020-10-12 2020-10-16 2020-11-12 2020-11-23 2020-11-15 2020-12-01 2020-12-11 2020-12-30 我想这样做: \d\d\d\d-NOT10-30 所以我想得到任何一年的所有日期,但不是第十个月的日期,重要的是,这一天是30天 我尝试了很多使用消极的前瞻性评估来实现这一点,但我没有找到任何有效的正则表达式

假设我们有这样一个文本:

2020-09-29
2020-09-30
2020-10-01
2020-10-02
2020-10-12
2020-10-16
2020-11-12
2020-11-23
2020-11-15
2020-12-01
2020-12-11
2020-12-30
我想这样做: \d\d\d\d-NOT10-30

所以我想得到任何一年的所有日期,但不是第十个月的日期,重要的是,这一天是30天

我尝试了很多使用消极的前瞻性评估来实现这一点,但我没有找到任何有效的正则表达式。

尝试:

/20\d{2}-(?:0[1-9]|1[12])-30/
说明:

20\d{2}它将匹配20XX

?:0[1-9]| 1[12]它将匹配0X或11,12

30它将与30相匹配

演示:

尝试:

/20\d{2}-(?:0[1-9]|1[12])-30/
说明:

20\d{2}它将匹配20XX

?:0[1-9]| 1[12]它将匹配0X或11,12

30它将与30相匹配

演示:

您可以使用:

角色?!10确保在插入正则表达式的点上没有10跟随。请注意,之后仍然需要匹配以下数字,因此\d\d部分

一般来说,据我所知,你不能否定一部分,然后也匹配字符串的一部分。但是如果是负面的,你可以像我上面做的那样模拟。广义的想法看起来像:

(?!<special-exclusion-pattern>)<general-inclusion-pattern>
其中,特殊排除模式与一般包含模式的子集匹配。在上述情况下,一般包含模式为\d\d,特殊排除模式为ins 10。

您可以使用:

角色?!10确保在插入正则表达式的点上没有10跟随。请注意,之后仍然需要匹配以下数字,因此\d\d部分

一般来说,据我所知,你不能否定一部分,然后也匹配字符串的一部分。但是如果是负面的,你可以像我上面做的那样模拟。广义的想法看起来像:

(?!<special-exclusion-pattern>)<general-inclusion-pattern>

其中,特殊排除模式与一般包含模式的子集匹配。在上述情况下,一般包含模式为\d\d,特殊排除模式为ins 10。

最简单的方法是将匹配/^\d{4}-10-30$/的子字符串(如果存在)转换为空字符串,然后在一个或多个换行上拆分生成的字符串

如果你的绳子

2020-10-16
2020-10-30
2020-11-12
2020-11-23
由变量str保存,例如在Ruby中

str.sub(/^\d{4}-10-30$/,'')
  #=> "2020-10-16\n\n2020-11-12\n2020-11-23\n"
所以


毫无疑问,您使用的任何语言都有类似的方法。

最简单的方法是将匹配/^\d{4}-10-30$/的子字符串(如果存在)转换为空字符串,然后在一个或多个换行符上拆分结果字符串

如果你的绳子

2020-10-16
2020-10-30
2020-11-12
2020-11-23
由变量str保存,例如在Ruby中

str.sub(/^\d{4}-10-30$/,'')
  #=> "2020-10-16\n\n2020-11-12\n2020-11-23\n"
所以


毫无疑问,你使用的任何语言都有类似的方法。

NOT10==0[1-9]| 1[12]你的问题不清楚。你说你想得到任何一年的所有日期,其中有365或366个,除了一个,10月30日。但这与你展示的字符串无关。您的意思是希望从字符串中提取除10月30日以外的所有日期吗?一些答案建议您希望列表中的所有日期都是30天,而月份不是10月。请编辑以澄清。NOT10==0[1-9]| 1[12]您的问题不清楚。你说你想得到任何一年的所有日期,其中有365或366个,除了一个,10月30日。但这与你展示的字符串无关。您的意思是希望从字符串中提取除10月30日以外的所有日期吗?一些答案建议您希望列表中的所有日期都是30天,而月份不是10月。请编辑以澄清。0\d可能过于宽泛,因为模式将匹配00我认为它只需要一个简单的正则表达式,0\d可能过于宽泛,因为模式将匹配00我认为它只需要一个简单的正则表达式,非常感谢!我试着那样做\d{4}-?!10-30但我不明白为什么它不起作用!非常感谢。这将匹配除第10个月以外的每个月第30天的所有日期。这如何帮助OP获得列表中的所有日期,但最多一个?非常感谢!我试着那样做\d{4}-?!10-30但我不明白为什么它不起作用!非常感谢。这将匹配除第10个月以外的每个月第30天的所有日期。这如何帮助OP获得列表中的所有日期,但最多一个?