我一直在查看有关正则表达式的各种主题,他们都说要找到反转(选择所有不符合条件的),您只需使用 [^]
语法或负前瞻。
我已经尝试在我的正则表达式上使用这两种方法,但结果不够充分,尤其是 [^]
似乎按字面意思理解其所有内容(即使在转义时)。
我需要这个的目的:
我有一个带有 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/