不匹配第二个大小写的Regex(.*)

不匹配第二个大小写的Regex(.*),regex,Regex,给定以下示例输入文本: {{A1 | def | ghi | jkl}你好,世界。{{A2}mno}再见世界 我如何创建一个正则表达式模式来只匹配{…}的第一个实例(即只{{A1 | def | ghi | jkl})A1和A2是固定输入,def、ghi、jkl和mno可以是任何内容 我试过这个: \{\{A1\|(.*)\|(.*)\|(.*)\}\} 但这会返回一切({{A1|def|ghi|jkl}}}你好,世界。{A2|mno}) 请注意,def或ghi或jkl或mno可以是数字、英文

给定以下示例输入文本:

{{A1 | def | ghi | jkl}你好,世界。{{A2}mno}再见世界

我如何创建一个正则表达式模式来只匹配
{…}
的第一个实例(即只
{{A1 | def | ghi | jkl}
A1
A2
是固定输入,
def
ghi
jkl
mno
可以是任何内容

我试过这个:

\{\{A1\|(.*)\|(.*)\|(.*)\}\}
但这会返回一切(
{{A1|def|ghi|jkl}}}你好,世界。{A2|mno}


请注意,
def
ghi
jkl
mno
可以是数字、英文字母或其他语言(如中文/日文/韩文)。

不清楚您试图实现的目标。起初,我认为你的问题只是你得到了全部,而你真正想要的只是
A1
A2
部分。如果是这样,下面是答案:


因为您没有指定使用哪种风格的正则表达式,所以很难说清楚。如果您使用的是支持环视的版本,则可以执行以下操作:

(?<={{)\w+(?=(\|[^|}]*)+}})
{{(\w+)(\|[^|}]*)+}}
如果这样做,则需要为每个匹配读取第一组的值

至于只找到第一个匹配项,这实际上取决于您使用的工具或语言。大多数正则表达式引擎在默认情况下只查找第一个匹配项,并且在指定全局修饰符时只查找其他匹配项(通常在结尾处
/g


然而,现在,在编辑了你的问题并试图更好地理解你的意思之后,我认为你真正的问题是贪婪。默认情况下,正则表达式中的重复(如
*
)是贪婪的。这意味着他们将捕获尽可能多的文本,并且仍然保持匹配。在这种情况下,您不希望它找到最长的匹配。在这种情况下,您希望它找到尽可能短的匹配项。你可以简单地通过使重复变得懒惰(即非贪婪)来做到这一点。为此,只需在
*
之后添加一个
。例如:

\{\{A1\|(.*?)\|(.*?)\|(.*?)\}\}
然而,这不是很有效。如果要经常使用此模式或在大型输入上使用此模式,则最好使用限制性更强的字符类,例如
[^}|]
,而不是
,这样就不需要延迟修饰符。例如:

\{\{A1\|([^}|]*)\|([^}|]*)\|([^}|]*)\}\}
或者,更简单地说:

{{A1(\|([^}|]*)){3}}}

您的模式的问题很简单,就是您使所有的
*
量词变得贪婪。它们尽可能多地匹配字符串(同时仍然允许整个模式匹配)。只要让他们不贪婪就行了
*?

\{\{A1\|(.*?)\|(.*?)\|(.*?)\}\}

请指定正则表达式的哪种风格(即哪种语言或工具)。有时候这没什么大不了的,但在这种情况下,环顾四周是最好的解决方案,正则表达式味道之间的差异非常重要。@Stevendogart:“在这种情况下,环顾四周是最好的解决方案”:真的吗?@CasimiritHippolyte哈!实际上,我对使用“最佳”一词犹豫不决,因为我知道它有点过于强调,没有更多的细节和一个冗长的术语,所以我理解你为什么要指出这一点。我知道SO上的regex社区有一种迂腐的嗜好,但没有English.SE网站那么糟糕,所以我想我会摆脱它。@Casimirithippolyte不错!由于更多的细节从OP似乎没有即将到来,去吧!史蒂文多加特:是的,但请注意,从悬念的角度来看,这种情况有点类似于“谁是老板”:“托尼会和安吉拉结婚吗?”“这是一个关于贪婪的问题吗?”。也许下一季会给我们答案。