正则表达式选择在模式中找不到的组

时间:2017-01-18 12:54:46

标签: regex pcre

我一直在研究关于SO的Regex上的各种主题,他们都说要找到反转(选择所有不符合符合标准)你只需使用[^]语法或否定前瞻。

我已尝试在我的Regex上使用这两种方法,但结果不够[^]特别是似乎从字面上理解了所有内容(即使在转义时)。

我需要这个:

我有一个带有SQL转储的大规模SQL行我试图删除所有不是行ID的字符,以及一列的数值。

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

我的正则表达式:

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

这匹配&#34; ),(<number upto 4 digits>,&#34;或&#34; ,<number of ten digits>,&#34;

主题

我的主题是一个500kb的SQL转储行看起来像这样(我已经在之前的简单查找/替换中删除了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,那么,获取正则表达式的语法是什么?要删除所有不匹配的组?你可以推荐什么作为解决这个问题的方法而不花费数小时手动阅读这些线?

1 个答案:

答案 0 :(得分:2)

您可以在PCRE中使用非常有用的For(= ' sort the PM's workbook , hide source data Application.DisplayAlerts = False NewWB.Sheets("Combined").Visible = False NewWB.Sheets("Sheet3").Delete NewWB.SaveAs "Budget usage - " & Year(Date) & "-" & Month(Date - 30) & " " & PMList(r) Dim i As Long SendKeys " ", True ' <-- it doesn't get to this line when the Excel Add-In pops up For i = 1 To 3 SendKeys "+{DOWN}", True Next i SendKeys "{ENTER}", True For i = 1 To 4 SendKeys "+", True Next i SendKeys "{ENTER}", True (*SKIP)(?!))构造来匹配您知道的这些文本,然后跳过并匹配要移除的所有其他文本:

(*SKIP)(*F)

请参阅regex demo

<强>详情:

  • (*SKIP)(*FAIL) - 匹配2个替代品中的1个:
    • /(?:\),\(\d{1,4},|,\d{10},)(*SKIP)(?!)|./s - (?:\),\(\d{1,4},|,\d{10},),然后是1到4位数,然后是\),\(\d{1,4},
    • ),( - 或
    • , - 逗号,10位数字,逗号
  • | - 省略匹配的文字并继续下一场比赛
  • ,\d{10}, - 或
  • (*SKIP)(?!) - 任何字符(从| DOTALL修饰符传递到正则表达式)

可以做同样的事情
.

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