正则表达式在字符串中查找字符

时间:2014-09-18 22:32:22

标签: regex

给出以下字符串

2010-01-01XD2010-01-02XX2010-01-03NX2010-01-04XD2010-01-05DN

我正在尝试查找日期的所有实例,后跟一个或两个字符,即2010-01-01XD,但不是字符XX

的位置

我试过了

(2010-01-02[^X]{2})|(2010-01-08[^X]{2})|(2010-01-07[^X]{2})|(2010-01-05[^X]{2})|(2010-01-15[^X]{2})

如果两个字符都不是X,则此方法有效。我也试过

(2010-01-02[^X]{1,2})|(2010-01-08[^X]{1,2})|(2010-01-07[^X]{1,2})|(2010-01-05[^X]{1,2})|(2010-01-15[^X]{1,2})

这适用于DX,但不适用于XD

所以想要更清楚一点

2010-01-01XD
2010-01-01DX
2010-01-01ND

以上所有内容都应该被拿起

2010-01-01XX

这忽略了

5 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式基于否定前瞻:

(20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])(?!XX)[A-Z]{2})

RegEx Demo

答案 1 :(得分:2)

最简单的方法是使用先行断言(如果可用)。

 # (2010-01-01|2010-01-02|2010-01-08|2010-01-07|2010-01-05|2010-01-15)(?!XX)(?i:([a-z]){1,2})

 (                        # (1 start), One of these dates
      2010-01-01
   |  2010-01-02
   |  2010-01-08
   |  2010-01-07
   |  2010-01-05
   |  2010-01-15
 )                        # (1 end)
 (?! XX )                 # Look ahead assertion, cannot match XX here
 (?i:                     # 1 or 2 of any U/L case letter
      ( [a-z] ){1,2}           # (2)
 )

答案 2 :(得分:2)

你可能会使用一个带有否定性前瞻的简单模式,例如:

\d{4}-\d{2}-\d{2}(?!XX)[A-Z]{1,2}

示例:http://regex101.com/r/dI1nW4/2

要允许Unicode字符(XX除外),您可以使用:

\d{4}-\d{2}-\d{2}(?!XX)\D{1,2}

示例:http://regex101.com/r/yB5fI0/1

答案 3 :(得分:1)

20[0-9]{2}-[01][0-9]-[0-3][0-9]([A-Z][A-WYZ]|[A-WYZ][A-Z])

See it in action

答案 4 :(得分:0)

负面展望是断言XX的字母的最简单方法,但通过识别共享日期的部分,可以对交替进行一些简化。你试图匹配的所有日期,使这个更短的正则表达式:

2010-01-(02|08|07|05|15)(?!XX)[A-Z]{1,2}