避免对我当前的需求进行灾难性的回溯

时间:2019-04-06 08:23:35

标签: regex regex-greedy

我必须匹配短语(单词组)(介于两者之间的任何内容)(单词组)中的某些特定条件,例如:

RUN go get -u github.com/pressly/goose/cmd/goose

RUN goose postgres "host=db user=user dbname=dbname sslmode=disable password=123" up

所以任何时候我都想匹配“ mirror bananas banannas人口”。这是最好的解决方案吗?容易发生灾难性的回溯吗?

1 个答案:

答案 0 :(得分:1)

window = Tk() # set up password #button which may accept the password/username button = Button(window, text='OK') button.config(width=5, height=2, command=somefunctionacceptingordeclining) def somefunctionacceptingordeclining(): if something == something: window.quit() #this closes the current window and resumes execution #where i put RESUME window.mainloop() # RESUME: #by importing the script below here you execute it when the window is closed. import someotherscript 部分可能会导致灾难性的回溯,因为经过(\s*\w+\s*\W*\s*)*?量化的组中唯一的强制性模式是*?,并且它被其他可选模式所包围(\w+\s*可能匹配空字符串,请注意,像\W*这样的相邻*量化模式匹配相同的字符,这是导致灾难性回溯的不良做法。

如果您test your regex against mirror banana banannas populatio,您将得到灾难性的回溯错误。

在您的情况下,最好的正则表达式方式是,当您从JSON文件中读取前导/后缀单词列表时,使用的是正则表达式,例如

\s*\W*\s*

您需要的值将在第1组中,或者如果您使用(?:leading_word1|leading_word2|...|leading_wordN)(.*?)(?:trailing_word1|trailing_word2|...|trailing_wordN) (例如您说的是使用Python),则该值将在列表中。