perl查找并替换匹配字符串的一部分(正则表达式问题)

时间:2015-03-04 23:08:11

标签: regex perl

假设我有一个巨大的xml文件,其中包含大量信息,包括电子邮件地址。因此,所有电子邮件地址都将如下所示:

用户 @ gmail.com

我遇到正则表达式交易的问题。我如何匹配电子邮件地址但只替换用户部分?我尝试使用前瞻性的锚点没有运气,(它最终在@ gmail.com之前取代了一切)有没有办法使用前瞻但只能在用户之前使用白色空间?或者有一个简单的解决方案吗?现在我有以下内容:

perl' s /(?= @ gmail.com)/ replacement $& / ge' file.xml

显然不起作用。任何帮助深表感谢!

3 个答案:

答案 0 :(得分:0)

使用除了空格和@:

之外的所有字符类
s/[^\s@]+(?=@gmail\.com)/replacement/g

答案 1 :(得分:0)

您可以随时使用html5电子邮件验证程序获取用户名 http://www.w3.org/TR/html5/forms.html#valid-e-mail-address

$string =~ s/[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)/$1/g;  

展开:

 [a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+ 
 (                                      # (1 start)
      @
      [a-zA-Z0-9] 
      (?:
           [a-zA-Z0-9-]{0,61} 
           [a-zA-Z0-9] 
      )?
      (?:
           \. 
           [a-zA-Z0-9] 
           (?:
                [a-zA-Z0-9-]{0,61} 
                [a-zA-Z0-9] 
           )?
      )*
 )                                      # (1 end)

答案 2 :(得分:0)

s/ (\S+)@gmail\.com/replacement string/g;

我认为这将解决您的问题

<email>this is user@gmail.com</email>

这个正则表达式

s/([^>]+)@gmail\.com/replacement string/g

将解决此问题

<email>user@gmail.com</email>

这个

s/([^"]+)@gmail\.com/replacement string/g

将解决此问题

<person email="user@gmail.com"></person>

结合起来,我们有

s/(\S+|[^>]+|[^"]+)@gmail\.com/replacement string/g