如何使用正则表达式选择除捕获组以外的所有内容?

3

问题:

暂时忘记下面的内容,因为我的细节看起来让人感到困惑(或者这确实很复杂)。

我想使用正则表达式匹配“除了这个(任何)捕获组匹配的内容之外的所有内容”。

我尝试过:

我看到了这个问题,但是答案和问题都只谈到了一个情况,没有解释语法如何/为什么工作,所以我无法理解它是如何实现的。

我看了一下使用?!的“负向先行断言”,但不太明白它如何实现我要做的事情。

我试图匹配除了一个捕获组之外的所有内容,例如("[a-z]*",)

例如,在这个多行列表中:

"buckeye",
"buckeye"
,
."
,"
"fbfdb
"feve,

如何使用正则表达式选择除捕获组之外的所有内容(在我的情况下应该匹配"buckeye",或任何一组"+任何数字a-z字符+",)?


我需要这样做的原因是因为我有一个文件,里面有很多条目,例如:

"aidman",
"aidmen",
"aids",
"aiglet",
"aiglets",
"aigret",
"aigrets",
"aigrette",
"aigrettes",
"aiguille",
"aiguilles",
"aikido",

我在文本编辑器中对其进行了一些替换以更改格式,但是在100,000行中的约20行发生了许多随机事件(一个错误)。因此,我需要找到格式不正确的行。

澄清:

我的目标只是要理解如何说“我想匹配除了这个捕获组之外的所有内容”。


1
我不理解“除了捕获组以外的一切”是什么意思。请给我们几个要匹配和不匹配的示例。 - Dialecticus
@Dialecticus,我上面澄清了,抱歉。但是真的,我正在尝试学习如何使用任何捕获组来完成它。 - user3818284
预期输出是什么? - Avinash Raj
@AvinashRaj看到我问题中第一个多行列表的第一行了吗?除了第一行之外,所有内容都应该与正则表达式匹配。 - user3818284
基本上,您需要用空字符串替换捕获的部分,并打印所有内容。 - JorgeeFG
显示剩余6条评论
2个回答

3

您可以使用PCRE动词(*SKIP)(*F)

"[^"]*",(*SKIP)(*F)|.+

演示

以上正则表达式将跳过所有"...",字符串,并匹配剩余的行。

或者

通过负向前瞻断言,

^(?!.*"[^"]*",).*$

演示

(?!.*"[^"]*",) 负向先行断言表示在该行中不存在类似于"...",的字符串。如果是,则相应的行将匹配。正则表达式中的前后环视用于条件检查。它不会消耗任何字符,但会断言是否会发生匹配。

^                        the beginning of the string
(?!                      look ahead to see if there is not:
  .*                       any character except \n (0 or more
                           times)
  "                        '"'
  [^"]*                    any character except: '"' (0 or more
                           times)
  ",                       '",'
)                        end of look-ahead
.*                       any character except \n (0 or more times)
$                        before an optional \n, and the end of the
                         string

1
哦,这个可以直接用!谢谢。我希望你能解释一下,这样我以后就知道怎么做了。 - user3818284
@jt0dd 哪一个?第一个还是第二个...我想我已经解释了第二个。告诉我你不理解哪一部分。 - Avinash Raj
它们两个看起来比我迄今为止使用的更复杂(抱歉,还在学习),你能解释一下它们两个是如何工作的吗? - user3818284
为什么在负向先行断言部分的开头要有.*?这个模式会跳过b"uckeye",在我看来这是一个错误的行。 - Dialecticus
1
然后从先行断言中删除.*,变为^(?!"[^"]*",).*$。谁知道操作者到底想要什么... - Avinash Raj

0

所以你想在文件中查找错误,其中正确的行的格式为"[a-z]*",。虽然我无法说明如何使用正则表达式实现这一目标,但我可以说出我将如何实现。我会使用Notepad++进行以下几个步骤:

  1. 按Ctrl+F,将选项卡从“查找”更改为“标记”,勾选“书签行”选项,并搜索模式"[a-z]*",
  2. 当所有正确行都被加为书签时,反转书签(菜单“搜索”>“书签”>“反向书签”)
  3. 复制所有加了书签的行(菜单“搜索”>“书签”>“复制带书签的行”),并将它们粘贴到另一个空文件中(Ctrl+V)

谢谢,这真是太棒了,因为它现在帮我解决了麻烦。我很惊讶居然没有人知道如何在正则表达式中做“除了这个捕获组之外的所有事情”! - user3818284

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接