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

Posted

技术标签:

【中文标题】如何使用正则表达式选择除捕获组之外的所有内容?【英文标题】:How do I select everything except the capture group with Regex? 【发布时间】:2014-11-01 02:03:28 【问题描述】:

问题:

暂时忘记下面的一切,因为我的细节似乎让人们感到困惑(否则这真的很复杂)。

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

我的尝试:

I saw this question,但答案和问题都在谈论一种情况,而没有真正解释语法如何/为什么起作用,所以我无法弄清楚。

我用?! 查看了“负面展望”,但并不真正理解它是如何实现我想要做的。

我正在尝试匹配除捕获组之外的所有内容,例如 ("[a-z]*",)

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

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

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


之所以需要这个是因为我有一个包含很多条目的文件,例如:

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

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

澄清:

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

【问题讨论】:

我不明白“除捕获组之外的所有内容”是什么意思。举几个例子说明你想匹配什么,你不想匹配什么。 @Dialectus 我在上面澄清了,对不起。但实际上,我正在尝试学习如何使用 any 捕获组。 预期的输出是什么? @AvinashRaj 我想匹配 匹配该捕获组的任何内容。 所以你想匹配除"buckeye",..以外的所有字符。 【参考方案1】:

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

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

DEMO

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

通过否定前瞻断言,

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

DEMO

(?!.*"[^"]*",) 否定前瞻断言在该特定行中没有像 "...", 这样的字符串。如果是,则将匹配相应的行。正则表达式中的循环用于条件检查。它不会消耗任何字符,但会断言是否会发生匹配。

^                        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

【讨论】:

哦,原来如此!谢谢你。我希望你能解释一下,这样我以后就知道该怎么做了。 @jt0dd 哪一个?第一个或第二个.. 我想我已经解释了第二个。告诉我你不明白的部分。 嗯,它们看起来都比我目前使用的更复杂(抱歉,还在学习中),你能解释一下*两者是如何工作的吗? 为什么在负前瞻部分的开头有.*?此模式将跳过 b"uckeye", 在我看来这几乎是不正确的行。 然后从前瞻 ^(?!"[^"]*",).*$ 中删除 .* 。谁知道 op 到底想要什么....【参考方案2】:

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

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

【讨论】:

感谢这间接地很棒,因为它现在保存了我的 *ss。我很惊讶,似乎没有人知道如何在正则表达式中做“除了这个捕获组之外的所有事情”!

以上是关于如何使用正则表达式选择除捕获组之外的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 c# 获取捕获组的子组

如何使用正则表达式替换除指定字符串之外的所有内容

正则表达式 - 如何匹配除特定模式之外的所有内容

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

正则表达式:匹配除一个单词之外的所有内容[重复]

正则表达式:允许除某些选定字符之外的所有内容[重复]