如何使用Regex选择捕获组以外的所有内容?

时间:2014-11-01 02:03:29

标签: regex

问题:

忘记下面的所有内容一秒钟,因为我的细节似乎让人感到困惑(或者这真的很复杂)。

我希望与正则表达式匹配“除了此(任何)捕获组匹配的所有内容”。

我尝试了什么:

I saw this question,但答案和问题都是在谈论一种情况而没有实际解释语法如何/为什么有效,所以我无法弄明白。

我用?!查看了“负向前瞻”,但并不真正了解这是如何实现我想要做的。

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

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

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

如何选择捕获组以外的所有内容(在我的情况下应该与"buckeye",或任何" +任何数字字符+ ",匹配)与正则表达式?


需要这个的原因是因为我有一个包含大量条目的文件,例如:

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

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

澄清:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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