Notepad++中的正则表达式(搜索和替换)

5
我有一个包含数千条记录的.txt文档。 其中一些记录看起来是这样的
201910031044         "00059"    "11.31AG"  "Senior Champion"
201910031044         "00060"    "GBA146"  "Junior Champion"
201910031044         "00999"    "10.12G"  "ProAM"
201910031044         "00362"    "113.1LI"  "Abcd"

每当出现类似的记录时,我想删除最后引号中的最后一个单词/数字等(例如“高级冠军”,“初级冠军”等,这里有许多可能性)。
例如(之前):
201910031044         "00059"    "11.31AG"  "Senior Champion"

之后

201910031044         "00059"    "11.31AG"

我尝试了以下的正则表达式,但它不能工作。
搜索:^([0-9]{17,17} +“[0-9]{8,8}”+“[a-zA-Z0-9]”).*$ 替换:\ 1(替换字符串)
好的,我忘了点号(.)符号,但即使我没有点号(.)符号,它也无法工作。不确定使用多个加号(+)符号时是否有任何关系。

“Senior Champion” 这一行被更改的逻辑对我来说并不清楚。乍一看,我会说仅依靠正则表达式是不足以处理您的要求的;您将必须解析此文件。 - Tim Biegeleisen
4个回答

3
我想要去掉最后一个引号内的最后一个单词/数字等。以下代码可以完成此任务:
  • Ctrl+H
  • 查找内容: ^.+\K\h+".*?"$
  • 替换为: LEAVE EMPTY
  • 勾选 Wrap around
  • 勾选 Regular expression
  • 取消勾选 . matches newline*
  • 全部替换
解释:
^           # beginning of line
  .+        # 1 or more any character but newline
  \K        # forget all we have seen until this position
  \h+       # 1 or more horizontal spaces
  ".*?"     # something inside quotes
$           # end of line

屏幕截图(之前):

enter image description here

屏幕截图(之后):

enter image description here


谢谢。这个完美地解决了问题。我还发现一个问题,当制表位之间存在时,但这个解决方案对它们没有任何问题! - Elch007
@Elch007:\h 的作用就是匹配水平空格(即空格或制表符,[ \t])。 - Toto

0

你的字符计数有问题:

  • 您指定该行应以恰好17个数字开头([0-9]{17,17})。然而,数据201910031044中只有12个数字。
    • 您可以使用{12}来指定恰好12个数字,或者如果可能是12-17,则使用{12,17}。基于当前数据,我将假设恰好为12个数字。
  • 同样地,对于第二列,您指定它是由引号括起来的恰好8个数字("[0-9]{8,8}"),但它只有5个数字被引号括起来。
    • 同样地,您可以使用{5}来指定恰好5个数字,或者使用{5,8}来指定5-8个数字。我将假设恰好为5个数字。
  • 最后,最后一个字段没有量词,因此正则表达式尝试匹配由引号括起来的恰好一个字母或数字字符"[a-zA-Z0-9]"
    • 我不确定字符数是否有任何限制,因此我会使用+作为量词"[a-zA-Z0-9]+"来匹配一个或多个字符 - 如果可以有零个或多个,则可以使用*,或者如果是从mn的任何其他计数,则可以像以前一样使用{m,n}

这不是一个字符计数问题,但最后一列也可能包含点,但正则表达式没有考虑到。你可以在方括号内添加,它将匹配点字符。通常用作通配符,但在字符类([])中失去了其特殊含义,因此你得到"[a-zA-Z0-9.]+"

把所有内容放在一起,你就得到了

搜索:^([0-9]{12} + "[0-9]{5}" + "[a-zA-Z0-9.]+").*$
替换:\1

这将消除Notepad++中第三个字段之后的任何内容。

通过使用\d代替数字[0-9]和空格的\s+代替+,可以简化这个过程。作为一个好处,\s还会匹配其他空格,如制表符,所以你无需手动处理那些。这将导致

搜索:^(\d{12}\s+"\d{5}"\s+"[a-zA-Z0-9.]+").*$
替换:\1


0
正则表达式查找第4个双引号:
^(?:[^"]*\"){4}([^|]*)

您可以查看此演示:https://regex101.com/r/wJ9yS6/163

您仍然需要解析这些行,因此可能更容易在 Excel 中打开或使用代码作为 CSV 进行解析。


0

如果你想要去掉最后一组引号中的最后一个单词/数字等,你可以用一个分组来捕获在它之前的内容,并匹配最后一个引号和它之间的所有内容,然后使用否定字符类来删除它。

如果值之间的内容可以是空格或制表符,你可以使用[ \t]+来匹配它们(使用\s也可以匹配换行符)

请注意,{17,17}{8,8}也可以写成{17}{8},在这种情况下应该是{12}{5}

^([0-9]{12}[ \t]+"[0-9]{5}"[ \t]+"[a-zA-Z0-9.]+")[ \t]{2,}"[^"\r\n]+"

部分内容

  • ^字符串开头
  • (捕获第一组
    • [0-9]{12}[ \t]+匹配12个数字和1个或多个空格或制表符
    • "[0-9]{5}"[ \t]+匹配"之间的5个数字和1个或多个空格或制表符
    • "[a-zA-Z0-9.]+"匹配"之间的任何一项,至少1次
  • )关闭组
  • [ \t]{2,}匹配1次或多次
  • "[^"\r\n]+"

在替换中使用第一组$1

正则表达式演示

之前

enter image description here

之后

enter image description here


1
谢谢您提供的解决方案,它也很好地处理了制表位。是我把数字(17和8)搞错了! - Elch007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接