获取两个字符

时间:2012-11-28 13:33:21

标签: php regex notepad++

我有这样的CSV:

43132,000.121.211.254,,NO DATA,office@mail.com,VIEW,2012-11-28 13:17:31
43126,000.123.54.1,,NO DATA,mat.plast@mail.com,VIEW,2012-11-28 13:04:45
43121,000.24.74.155,,NO DATA,sales@mail.mail,VIEW,2012-11-28 12:58:38
43118,000.115.243.218,,NO DATA,guta@mail.com,VIEW,2012-11-28 12:55:59
43116,80006.124.167.204,,NO DATA,mogosanu@mail.ro,VIEW,2012-11-28 12:54:11

我要做的是用office替换notepad ++ mat.plastsalesgutamogosanuPRIVATEMAIL因此我需要一个正则表达式。

如何匹配,@之间的所有内容,以便我可以替换它

我的想法就像是

#\,(.*)\@#

非常感谢!

3 个答案:

答案 0 :(得分:2)

Find what: (?<=,)[^,@]+(?=@)
Replace with: PRIVATEMAIL

这是如何工作的? (?<=,)断言匹配开始于逗号右侧。 [^,@]+匹配任何非逗号,非at字符(尽可能多)。 (?=@)声称比赛右侧有@。请注意,实际匹配中不包括lookbehind和lookahead,这就是为什么它们不会被删除。

请注意,可以省略lookbehind,因为正则表达式引擎尝试从左到右匹配。

你可以在没有外观的情况下做同样的事情,但是你必须回写分隔符:

Find what: ,[^,@]+@
Replace with: ,PRIVATEMAIL@

(同样,您可以省略两个字符串中的前导逗号。)

这就是为什么你的模式不起作用的原因。首先,Notepad ++不对正则表达式使用分隔符,因此不需要周围的#(而是将它们视为要匹配的文字字符)。其次.*匹配任何字符(换行符除外,除非您选择该选项)。这包括逗号和标志。因此,将匹配字符串中的第一个逗号。然后.*很乐意消耗所有内容,直到@(包括其间的所有值)。这就是为什么我们需要使用否定的字符类从重复的字符中排除,

答案 1 :(得分:0)

/,([A-Za-z]+)\@/似乎符合您的要求,HashGuy。

答案 2 :(得分:0)

Find what: ,[^\@,]+\@([^\.]+\.[^,]+),
Replace with: ,PRIVATEMAIL@\1,

这不会改变包含@的东西,但它不像电子邮件。