您认为正则表达式匹配更长交替的假设是不正确的。
如果你有时间,让我们看看你的正则表达式是如何工作的......
快速复习:正则表达式的工作原理:状态机总是从左到右读取,必要时回溯。
有两个指针,一个在 Pattern 上:
(cdefghijkl|bcd)
你的字符串上的另一个:
abcdefghijklmnopqrstuvw
字符串上的指针从左边移动。一旦它可以返回,它将:

(来源:gyazo.com)
让我们把它变成一个更“顺序”的顺序来理解:

(来源:gyazo.com)
你的foobar例子是一个不同的话题。正如我在这篇文章中提到的:
正则表达式的工作原理:状态机总是从左到右读取。,|,, == ,,因为它总是只匹配第一个交替。
很好,Unihedron,但我如何强制它进入第一个交替?
看!*
^(?:.*?\Kcdefghijkl|.*?\Kbcd)
这里有一个正则表达式演示。
此正则表达式首先尝试将整个字符串与第一个交替匹配。只有当它完全失败时,它才会尝试匹配第二个交替。\K在这里用于保持与结构后面的内容的匹配\K。
*:\K自 2.0.0 起在 Ruby 中得到支持。
阅读更多:
啊,我很无聊,所以我优化了正则表达式:
^(?:(?:(?!cdefghijkl)c?[^c]*)++\Kcdefghijkl|(?:(?!bcd)b?[^b]*)++\Kbcd)
你可以在这里看到一个演示。