此正则表达式无法匹配被{}包围的单词

时间:2019-06-23 11:32:02

标签: regex

所以这是我的正则表达式,用于匹配“ define”或“ define:”之后的单词

((?<=define |define: )\w+)

该部分一切正常。但是,当我添加该部分时,如果可以的话,它也应该与{}之间的单词匹配,它会匹配所有内容。

((?<=define |define: )\w+)|([^{][A-Z]+[^}])

The regex with the examples

我注意到的是,当我首先添加^ [{]时,它破坏了所有内容,我不明白为什么。

2 个答案:

答案 0 :(得分:2)

  

为什么不能使用[^{]

通过使用[^{],您的正则表达式将变为:

[^{][A-Z]+[^}]

换句话说,这翻译为:

  • 不是{的字符
  • 一堆字母
  • 不是}的字符

请注意,您的正则表达式中没有任何内容可以使“一堆字母”部分必须位于{}之间。它只是说它必须在非{的字符之后,以及非}的字符之前。按照这种逻辑,即使ABC之类的东西也将匹配,因为A不是{B是一堆字母,而C不是{{1 }}。

  

如何在}之间匹配单词?

您可以使用此正则表达式:

{}

并获得组1。

我不认为您应该将此与与{([A-Z]+)} 之后的单词匹配的正则表达式结合使用。您应该使用2个单独的正则表达式,因为这是两个完全不同的东西。

因此将其分成两个正则表达式:

define

(?<=define |define: )\w+

答案 1 :(得分:2)

您正在使用否定字符类,就像我们在正(?<=)后面使用正向后看和(?=)之前向后看一样。它们本质上是不同的,并且相对于向后看或向前看,字符类消耗字符。

因此:

  • [^{][A-Z]匹配一个大写字母,该字母后跟{以外的其他字符。
  • [A-Z][^}]匹配一个大写字母,后跟}以外的其他字符。

因此,如果您尝试将{OO}中的字母与正则表达式[^{][A-Z]+[^}]进行匹配,则正则表达式将不匹配任何内容,这是很正常的,因为您有两个字母,其中一个字母前面带有{{ 1}},另一个后跟{