在模式中找不到正则表达式 Select 组

Regex Select groups not found in a pattern

我一直在 SO 上查看有关 Regex 的各种主题,他们都说要找到反转(select 所有 适合条件)您只需使用 [^] 语法或否定前瞻。

我已经尝试在我的 Regex 上使用这两种方法,但结果并不充分,[^] 尤其是似乎从字面上理解了所有内容(即使在转义时也是如此)。

我需要这个做什么:

我有一个巨大的 SQL 行和一个 SQL 转储 我正在尝试删除所有不是行 ID 的字符,以及一列的数值。

我的正则表达式可以准确匹配我正在寻找的内容;我需要做的是 反转 这个匹配项,这样我就可以删除 IDE 中所有 不匹配的 部分。

我的正则表达式:

/(\),\(\d{1,4},)|(,\d{10},)/

这匹配“),(<number upto 4 digits>,”或“,<number of ten digits>,”。

主题

我的主题是 SQL 转储的 500Kb 行,看起来像这样(我已经在之前的简单 find/replaces 中删除了 a-z 和其他不需要的字符):

),(39,' ',1,'01761472100','@','9    ','20',1237213277,0,1237215419,''),(40,' ',3,'01445731203','@',' ','-','22 2','210410//816',1237225423,0,1484651768,''),(4270,' / 

我的目标是使用正则表达式实现以下输出:

),(39,,1237213277,,1237215419,),(40,,1237225423,,1484651768,),(4270,

然后我可以重新检查并轻松删除重复项,例如逗号。


我已阅读 that Negation in Regex is tricky,那么,使我制作的正则表达式倒转的语法是什么?要删除所有不匹配的组?您可以推荐什么方法来解决这个问题,而无需花费数小时手动阅读这些行?

您可以使用 PCRE 中非常有用的 (*SKIP)(?!)(=(*SKIP)(*F)(*SKIP)(*FAIL))构造来匹配您知道的这些文本,然后跳过并匹配所有其他文本以删除:

/(?:\),\(\d{1,4},|,\d{10},)(*SKIP)(?!)|./s

regex demo

详情:

  • (?:\),\(\d{1,4},|,\d{10},) - 匹配 2 个选项中的 1 个:
    • \),\(\d{1,4}, - ),(,然后是 1 到 4 位数字,然后是 ,
    • | - 或
    • ,\d{10}, - 一个逗号,10位数字,一个逗号
  • (*SKIP)(?!) - 省略匹配的文本并继续下一个匹配
  • | - 或
  • . - 任何字符(因为 /s DOTALL 修饰符被传递给正则表达式)

同样可以用

/(\),\(\d{1,4},|,\d{10},)?./s

并替换为 反向引用(因为我们需要放回使用我们需要保留的模式捕获的文本),请参阅 another regex demo