我有这样的数据
Giftsbirth;;Basket7;CC
Giftswedding;;Cake4;COD
我正试图找到一个仅选择第二个数据的正则表达式(Basket7,Cake4)。
在过去的帮助下,我尝试了类似的操作
^(\w+ [^\v;;]+;;[^\v;]+)?.*
但是我知道那是不对的
如果可以,请协助使用正则表达式
答案 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
是您需要保留的值。
答案 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>或 "
("
后跟;
以外的任何字符,其中包括"
,后跟_
)。