正则表达式匹配重复的字符

时间:2016-03-02 00:37:29

标签: regex go

我正在尝试创建一个匹配字符串的正则表达式,如果它在一行中有3个或更多重复字符(例如aaaaaa,testtttttt,otttttter)。

我尝试了以下内容:

this.subWorkerA.work((TaskA)task)

连续匹配任意 3个字符,但不匹配连续字符......我哪里出错?

3 个答案:

答案 0 :(得分:6)

使用 true 正则表达式无法完成您所要求的内容,您需要的是(不规则的)反向引用。虽然许多正则表达式引擎实现它们,但Go使用的RE2却没有。 RE2是一个快速的regexp引擎,可以保证线性时间字符串处理,但是没有已知的方法来实现具有这种效率的反向引用。 (有关详细信息,请参阅https://swtch.com/~rsc/regexp/。)

要解决您的问题,您可能需要搜索其他一些正则表达式库。我相信可以找到PCRE的绑定,但我没有他们的个人经验。

另一种方法是手动解析字符串而不使用(ir)正则表达式。

答案 1 :(得分:1)

这是一个丑陋的解决方案,您可以自动生成它:

from tkinter import *
from tkinter import ttk


after_id = None

def clockwise_move(e):
    global after_id, c, n
    n += 1

    canvas.coords(square1, *c[n % len(c)])
    canvas.coords(square2, *c[(n + 1) % len(c)])
    canvas.coords(square3, *c[(n + 2) % len(c)])
    canvas.coords(square4, *c[(n + 3) % len(c)])

    after_id = e.widget.after(1000, clockwise_move, e)

def stop(e):
    e.widget.after_cancel(after_id)


main = Tk()

frame = ttk.Frame(main)
button_frame = ttk.Frame(frame)
canvas = Canvas(frame, width=500, height=500)

c = [(0, 0, 250, 250),
     (250, 0, 500, 250),
     (250, 250, 500, 500),
     (0, 250, 250, 500)]

n = len(c)

square1 = canvas.create_rectangle(*c[n % len(c)], fill="red")
square2 = canvas.create_rectangle(*c[(n + 1) % len(c)], fill="yellow")
square3 = canvas.create_rectangle(*c[(n + 2) % len(c)], fill="blue")
square4 = canvas.create_rectangle(*c[(n + 3) % len(c)], fill="green")

clockwise = ttk.Button(button_frame, text="Clockwise")
clockwise.grid(column=2, row=3)
clockwise.bind("<Button-1>", clockwise_move)
clockwise.bind("<Leave>", stop)

frame.pack()
canvas.grid(column=1, row=1)
button_frame.grid(column=2, row=1)

for child in button_frame.winfo_children():
    child.grid_configure(padx=10, pady=20)

main.mainloop() 

答案 2 :(得分:1)

由于存在问题,我最终确定了以下非正则表达式解决方案:

norm = "this it a ttttt"
repeatCount := 1
thresh := 3
lastChar := ""
for _, r := range norm {
    c := string(r)
    if c == lastChar {
        repeatCount++
        if repeatCount == thresh {
            break
        }
    } else {
        repeatCount = 1
    }
    lastChar = c
}