代码之家  ›  专栏  ›  技术社区  ›  Andrea Ambu

是否可以将字符重复与regex匹配?怎么用?

  •  11
  • Andrea Ambu  · 技术社区  · 16 年前

    问题:
    使用regex是否可以匹配在不同位置包含相同字符的单词?

    条件:
    所有单词的长度都相同,您知道重复字符的字符位置(例如第一、第二和第四个字符),但您不知道它是什么。

    实例:
    使用小写6char单词,我想匹配第3个和第4个字符相同的单词。

    parrot <- match for double r
    follia <- match for double l 
    carrot <- match for double r
    mattia <- match for double t
    rettoo <- match for double t
    melone <- doesn't match
    

    我不能使用量词[\d]2,因为它匹配两个字符的任何连续,如果我说第二和第四位置而不是第三和第四位置呢?

    可以用regex做我想做的吗?如果是,我该怎么做?

    编辑:
    在评论中问我,我用的是python

    4 回复  |  直到 16 年前
        1
  •  31
  •   Gumbo    16 年前

    可以使用backreference执行此操作:

    (.)\1
    

    这将匹配任何字符的连续出现。


    编辑 ____这里__s some python example:

    import re
    
    regexp = re.compile(r"(.)\1")
    data = ["parrot","follia","carrot","mattia","rettoo","melone"]
    
    for str in data:
        match = re.search(regexp, str)
        if match:
            print str, "<- match for double", match.group(1)
        else:
            print str, "<- doesn't match"
    
        2
  •  8
  •   Arvind    16 年前

    对于这种情况,您需要使用反向引用。我不确定您使用的是哪种语言,我在vi编辑器中尝试了下面的示例来搜索任何重复的字母表。 模式正则表达式: \([a-z]\)\1

    如果您看到这个例子,[a-z]是您正在搜索的模式,并将其包含在paranthesis中(paranthesis应该用某些语言进行转义)。一旦你有了偏执狂,它就是一个群体,可以通过使用\1在regex中的任何地方再次被引用。如果有多个组,您可以使用\1、\2等。1将替换为第一个组中匹配的内容。

    谢谢 阿文德

        3
  •  2
  •   Martijn Laarman    16 年前

    /(\b\w*?(\w)\2.*?\b)/

    至少在字符重复上匹配任何单词 1美元就是这个词 第一次重复是2美元。

        4
  •  0
  •   Alan Moore Chris Ballance    16 年前

    是的,可以使用backreference构造来匹配双字母。

    正则表达式 (?<char>\w)\k<char> ,使用命名组和反向引用搜索相邻的成对字符。当应用到字符串“我要喝一杯小咖啡”时,它会在单词“我要”、“小”和“咖啡”中找到匹配项。元角色 \w 查找任何单字字符。分组构造 (?<char>) 将元字符括起来,以强制正则表达式引擎记住子表达式匹配项(在本例中,将是任何单个字符),并将其保存在名称“char”下。backreference构造 \k<char> 使引擎将当前字符与存储在“char”下的先前匹配的字符进行比较。当单个字符与前面的字符相同时,整个正则表达式成功地找到匹配项。