我正在处理《哥德尔、艾舍尔、巴赫》第2章中的MIU系统问题。
其中一条规则如下:
规则III:如果你的集合中有一个字符串包含III,则可以新建一个字符串,将III替换为U。
这意味着字符串MIII可以变成MU,但对于其他更长的字符串可能存在多种可能性[匹配在方括号内]:
- MIIII可以产生
- M[III]I >> MUI - MI[III] >> MIU
- MUIIIUIIIU可以产生
- MU[III]UIIIU >> MUUUIIIU - MUIIIU[III]U >> MUIIIUUU
- MUIIIIU可以产生
- MU[III]IU >> MUUIU - MUI[III]U >> MUIUU
显然,正则表达式如/(.*)III(.*)/有所帮助,但似乎无法生成每个可能的匹配项,只能找到第一个。
是否有一种方法可以生成每个可能的匹配项?
(注意,我可以想到完全手动处理的方法,但希望使用内置工具、正则表达式或其他方式找到更好的方法。)
(编辑后以澄清重叠需要。)
其中一条规则如下:
规则III:如果你的集合中有一个字符串包含III,则可以新建一个字符串,将III替换为U。
这意味着字符串MIII可以变成MU,但对于其他更长的字符串可能存在多种可能性[匹配在方括号内]:
- MIIII可以产生
- M[III]I >> MUI - MI[III] >> MIU
- MUIIIUIIIU可以产生
- MU[III]UIIIU >> MUUUIIIU - MUIIIU[III]U >> MUIIIUUU
- MUIIIIU可以产生
- MU[III]IU >> MUUIU - MUI[III]U >> MUIUU
显然,正则表达式如/(.*)III(.*)/有所帮助,但似乎无法生成每个可能的匹配项,只能找到第一个。
是否有一种方法可以生成每个可能的匹配项?
(注意,我可以想到完全手动处理的方法,但希望使用内置工具、正则表达式或其他方式找到更好的方法。)
(编辑后以澄清重叠需要。)
RegExp.exec
可以为您工作,但您需要使用匹配对象,就像 Kolink 的答案中所示。在这种情况下,indexOf
可能更好,但正则表达式肯定更通用。 - Ray Toal