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

标签 regex pcre

我一直在查看有关正则表达式的各种主题,他们都说要找到反转(选择所有不符合条件的),您只需使用 [^] 语法或负前瞻。

我已经尝试在我的正则表达式上使用这两种方法,但结果不够充分,尤其是 [^] 似乎按字面意思理解其所有内容(即使在转义时)。

我需要这个的目的:

我有一个带有 SQL 转储的大量 SQL 行,我试图删除除行 ID 之外的所有字符以及一列的数值。

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

我的正则表达式:

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

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

主题

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

最佳答案

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

/(?:\),\(\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

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

关于正则表达式 选择在模式中找不到的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41719987/

相关文章:

C++ 实现正则表达式映射

regex - Solaris 11 中的字符串替换

正则表达式模式匹配包含一个字符

regex - 使用 GREP/Regex 将 url 中的下划线替换为给定的 url 扩展

python - 正则表达式替换匹配项

c++ - 如何用 Unicode 处理 PCRE?

php - 正则表达式 (?&lt;!-) 是什么意思

php - 如何不使用正则表达式否定前瞻来捕获整个组

php - 恰好 10 个字符的 perl 正则表达式

regex - Haskell 中的 PCRE - 什么,在哪里,如何?