正则表达式在记事本中带有2个半冒号

时间:2018-07-04 12:11:02

标签: regex notepad++

我有这样的数据

Giftsbirth;;Basket7;CC
Giftswedding;;Cake4;COD

我正试图找到一个仅选择第二个数据的正则表达式(Basket7,Cake4)。

在过去的帮助下,我尝试了类似的操作

^(\w+ [^\v;;]+;;[^\v;]+)?.*

但是我知道那是不对的

如果可以,请协助使用正则表达式

3 个答案:

答案 0 :(得分:1)

您可以使用(?<=后面的正向断言来断定;;之前是什么,而使用(?=前面的正向断言来断言后面是;

使用否定的character class [^;]+来匹配;来匹配您的值。

(?<=;;)[^;]+(?=;)

答案 1 :(得分:1)

您可以使用

(?:.*;)?([^;\n\r]+);[^;\n\r]+$

或者,

.*?;;([^;\r\n]+)(?:;.*)?

并替换为$1

详细信息

  • (?:.*;)?-一个可选的子字符串,具有除换行符以外的0+个字符,并且尽可能多,直到;
  • ([^;\n\r]+)-第1组:CR,LF和;以外的任何一个或多个字符
  • ;-分号
  • [^;\n\r]+-除CR,LF和;之外的任何一个或多个字符
  • $-行尾。

第二个正则表达式匹配

  • .*?;;-直到(包括)第一个;;的任何0+个字符都尽可能少了
  • ([^;\r\n]+)-第1组:CR,LF和;以外的任何一个或多个字符
  • (?:;.*)?-一个可选的组,匹配;的1或0次出现,然后匹配直到行尾的任意0+个字符

替换中的$1是您需要保留的值。

enter image description here

答案 2 :(得分:0)

您需要更精确地指定“第二个数据(Basket7,Cake4)”的含义。看起来像;被设置为分隔符的CSV数据,但是由于第二列为空,因此会将Basket7和Cake4放在第三列中。为了编写一个在一般情况下解决此问题的正则表达式,您需要考虑所有可能行的整个域,并且只给出了两个示例,让每个人都猜出底层的含义格式和可能的全部变化。

例如,总是合理地假设您要查找的内容始终以;;开头并以;结尾,而;;从未出现在其他位置比您要寻找的地方靠前的地方?在这种情况下,(?<=;;)([^;]*)捕获了这一点。但是,如果遇到以下任一行怎么办?

Giftsbirth;;;CC             # Here, the thing matched is empty
Giftsbirth;1600;Basket7;CC  # Here, the second column isn't empty
;;Basket7;CC                # Here, the first column is empty
;;;CC                       # Here, all but the last column are empty
;;;                         # Here, all columns are empty

您可能会遇到各种各样的建议,这些建议会给您“正确的文本”,但是,如果您在有限的子集上对此进行了测试,而该子集并未考虑输入中可以合理预期的所有变化,则不可避免地必须修改您的文本正则表达式。

假设这是CSV ,其中的字段不包含文字; ,并且您对任何字段的长度一无所知(因此,第二列并不总是空的),但是至少有三列,您可以考虑使用正则表达式:

^[^;]*;[^;]*;([^;]*)

(请参见https://regex101.com/r/vhPNEj/1上的演示)


这些假设可能不正确,但是我的猜测能力比您的假设差很多,因为您坐的数据样本量更大。为了成功完成任务的自动化,至关重要的是,您必须学习修改代码以符合您的假设。

例如,您可能要忽略第三列为空的情况:

^[^;]*;[^;]*;([^;]+)

这里的区别是[^;]*变成了[^;]+

或者您可能要考虑到第一列用双引号引起来时可能包含分号,例如像"Giftsbirth; Holiday";;Basket7;CC

^(?:[^;"]*|"[^"]*");[^;]*;([^;]*)

这里的区别是[^;]*变成了(?:[^;"]*|"[^"]*")或{em> [^;"]*(除;"之外的所有"[^"]*" < em>或 ""后跟;以外的任何字符,其中包括",后跟_)。