【问题标题】:Sublime Text 2 - Regex Search - Non-Capture Group SyntaxSublime Text 2 - 正则表达式搜索 - 非捕获组语法
【发布时间】:2013-05-07 15:23:19
【问题描述】:

我正在尝试在搜索和替换中使用 ST2 的正则表达式功能,但不知道如何创建一个非捕获组。对于此示例,我想查找 not 后跟“UMBER”的“DEAN”实例,即区分“DEANCARE”和“DEANUMBER”

从我过去阅读和使用的内容来看,非捕获的语法应该是:

DEAN(?:UMBER)

应该匹配“DEANCARE”但“DEANUMBER”。然而,Sublime Text only 会发现“DEANUMBER”,就像我输入了一样:

DEAN(UMBER)

在第一个(或每个)不需要的字母上使用方括号是否有效:

DEAN[^U] 

但我仍然更喜欢使用组不匹配而不是用于其他目的,并且避免必须明确不匹配每个单独的字符。我是否有语法错误,或者 ST2 的正则表达式如何工作的概念错误?

【问题讨论】:

  • 你不明白什么是非捕获组。你需要的是一个消极的前瞻:DEAN(?!UMBER)

标签: regex search replace sublimetext2


【解决方案1】:

非捕获组与组相同,只是它不捕获反向引用中正则表达式的匹配部分。

如果您要在字符串 DEANUMBER 上使用正则表达式 DEAN(?:UMBER),那么您将有一个匹配项,但引用 \1,例如搜索和替换不会给你任何东西,因为该组是非捕获的。

另一方面,使用DEAN(UMBER),您可以进行搜索并替换为made of L\1,这将产生made of LUMBER,因为第一个(捕获)组的匹配被\1 反向引用。这当然是一个非常没有意义的例子,如果你想了解更多关于组和反向引用的信息,我建议你阅读this 或其他一些关于此事的文档/教程。

根据 cmets 的建议,您需要的是 negative lookahead

【讨论】:

  • 你好。很抱歉打开这样一个老问题,但我认为我最好对一个老问题写评论,而不是创建一个新问题。问题类似于主题:Sublime Text 中非捕获组的语法是什么?我使用 ST3,它使用 Boost 正则表达式引擎,我希望 ST2 也使用它。当我在字符串 DEANUMBER 上使用您的正则表达式 (DEAN(?:UMBER)) 时,它会捕获 DEANUMBER。那么如何正确使用呢?我需要的正是我所问的,而不是先行/后行。提前致谢!
  • @lucifer63:非捕获组的语法是(?:)。但是,在您的正则表达式中,您将DEAN(?:UMBER) 包含在一个捕获组中,这就是它捕获DEANUMBER 的原因。非捕获组的目的是将事物组合在一起,但不让它们被反向引用。为了说明差异,请尝试在 ST3 中对字符串 DEANUMBER 使用以下两个正则表达式 - (DEAN)(?:UMBER) 替换为 G1: \1 - G2: \2(DEAN)(UMBER) 替换为 G1: \1 - G2: \2,这应该说明差异:分别为 G1: DEAN - G2:G1: DEAN - G2: UMBER
  • @rvalvik:这就是我问这个问题的原因 - 对我来说,它分别是 G1:DEAN - G2:UMBER 和 G1:DEAN - G2:UMBER。看 -> i.imgur.com/t56P2Jo.png
  • 您的截图是正确的,它们都匹配相同的字符串。 唯一的区别在于(DEAN)(UMBER) 具有UMBER 反向引用为\2(DEAN)(?:UMBER) 没有\1 反向引用。您是否尝试进行搜索和替换?如果像我描述的那样搜索和替换结果都是G1: DEAN - G2: UMBER,那么就有问题了。
  • @rvalvik:我创建了一个只有 DEANUMBER 文本的新文档。然后我按 Ctrl+Shift+F,选择“正则表达式”选项,我还选择了“显示上下文”和“使用缓冲区”选项。然后我在第一个输入字段(“查找”)中粘贴“(DEAN)(UMBER)”,在“替换字段”中输入“lol”,然后单击“替换”按钮,DEANUMBER 被替换为 lol。如果我首先粘贴“(DEAN)(?:UMBER)”,也会发生同样的情况
猜你喜欢
  • 2012-08-02
  • 2014-08-16
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多