可以用正则表达式匹配字符重复吗?怎么做?

23 投票
4 回答
27228 浏览
提问于 2025-04-15 12:24

问题:
用正则表达式能不能匹配一个单词,其中同一个字符出现在不同的位置上?

条件:
所有单词的长度都是一样的,你知道重复字符的位置(比如第1位、第2位和第4位),但你不知道这个字符是什么。

例子:
我想用小写的6个字母的单词,匹配那些第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},因为它会匹配任何两个字符的连续组合。如果我说的是第2位和第4位,而不是第3位和第4位呢?

用正则表达式能做到我想要的效果吗?如果可以,我该怎么做呢?

编辑:
在评论中有人问,我是在用python。

4 个回答

2

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

这个表达式会匹配任何包含至少一个字符重复的单词。
$1 代表整个单词,
$2 代表第一次重复的那个字符。

8

在这种情况下,你需要使用回溯引用。我不太确定你用的是什么编程语言,但我在我的VI编辑器中尝试了以下例子,来查找任何重复的字母。

正则表达式模式: \([a-z]\)\1

在这个例子中,[a-z]是你要查找的模式,把它放在括号里(在某些语言中,括号需要加上转义符)。一旦你有了括号,它就形成了一个组,可以在正则表达式的其他地方用\1来引用。如果有多个组,你可以用\1、\2等等。这里的\1会被第一个组匹配到的内容替换。

谢谢,
Arvind

54

你可以使用反向引用来实现这个功能:

(.)\1

这样可以匹配连续出现的任何字符。


编辑   这里有一个Python的例子:

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"

撰写回答