代码之家  ›  专栏  ›  技术社区  ›  Peter Lee

C#用于匹配“ABAB”、“AABB”、“ABB”、“AAB”、“ABAC”和“ABCB”的正则表达式

  •  2
  • Peter Lee  · 技术社区  · 15 年前

    我对编写正则表达式来匹配“ABAB”、“AABB”、“ABB”、“AAB”、“ABAC”和“ABCB”感到失望。

    以“ABAB”为例,将匹配以下所有字符串:

    abab
    bcbc
    1212
    xyxy
    9090
    0909
    

    这意味着正则表达式应该匹配第一个和第三个字符相同、第二个和第四个字符也相同的字符串,但是第一个和第二个字符不应该相同(当然,第三个和第四个字符不应该相同)。

    我说清楚了吗?

    谢谢。

    彼得

    1 回复  |  直到 15 年前
        1
  •  5
  •   Julien Hoarau    15 年前

    ABAB样图案

    (\w)(\w(?<!\1))\1\2
    
    • (\w) 匹配一个单词字符(数字、字母…)并将匹配捕获到回溯引用1中
    • (\w...) 匹配一个单词字符(数字、字母…)并将匹配捕获到回溯引用2中
    • (?<!\1) 断言不可能将捕获组1匹配的正则表达式与此位置结束的匹配匹配匹配( negative lookbehind )
    • \1 与捕获组1最近匹配的文本匹配
    • \2 与捕获组2最近匹配的文本匹配

    其他模式

    • AABB ==> (\w)\1(\w(?<!\1))\2
    • ABB ==> (\w)(\w(?<!\1))\2
    • AAB ==> (\w)\1(\w(?<!\1))
    • ABAC ==> (\w)(\w(?<!\1))\1(\w(?<!\1|\2))
    • ABCB ==> (\w)(\w(?<!\1))(\w(?<!\1|\2))\2