Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl查找并替换匹配字符串的一部分(regex问题)_Regex_Perl - Fatal编程技术网

perl查找并替换匹配字符串的一部分(regex问题)

perl查找并替换匹配字符串的一部分(regex问题),regex,perl,Regex,Perl,假设我有一个巨大的xml文件,其中包含一组信息,包括电子邮件地址。因此,所有电子邮件地址如下所示: user@gmail.com 我遇到的问题涉及正则表达式。如何匹配电子邮件地址,但仅替换用户部分?我尝试过使用前瞻性锚,但运气不佳,(它最终取代了@gmail.com之前的所有内容)有没有办法使用前瞻性锚,但只能在用户之前的空白处使用?还是有一个简单的解决办法?现在我有一些类似的东西: perl的/(?=@gmail.com)/replacement$&/ge'file.xml 这显然不起作用。非

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

user@gmail.com

我遇到的问题涉及正则表达式。如何匹配电子邮件地址,但仅替换用户部分?我尝试过使用前瞻性锚,但运气不佳,(它最终取代了@gmail.com之前的所有内容)有没有办法使用前瞻性锚,但只能在用户之前的空白处使用?还是有一个简单的解决办法?现在我有一些类似的东西:

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


这显然不起作用。非常感谢您的帮助

使用除空格和@之外的所有字符类:

s/[^\s@]+(?=@gmail\.com)/replacement/g

您可以随时使用html5电子邮件验证程序获取用户名。

扩大:

 [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)
我认为这将解决您在这种情况下的问题

<email>this is user@gmail.com</email>
<email>user@gmail.com</email>
将解决此情况

<email>this is user@gmail.com</email>
<email>user@gmail.com</email>
将解决这个问题

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

我不明白,你想替换用户部分,但你的例子是,在@gmail.com之前,我想做的就是替换用户部分。在我的示例中,我说这是错误的,这正是我目前拥有的。请添加一个正确的示例,抱歉,我仍然不清楚如果我给你一个文件,并且在这个文件中有一个字符串“user@gmail.com我想用其他字符串替换“user”。我无法添加正确的示例,因为我不知道如何添加。这最终会替换@gmail.comPlease之前的“gmail”文本,而不是“user”部分。请看一看。它看起来工作正常,它取代了用户部分。或者,向我们提供您的输入数据。这最终提供了我所需要的,谢谢!!(为了让它工作,我还必须转义@)如果只需要一个字符串,那么在正则表达式中不需要g标志
s/([^"]+)@gmail\.com/replacement string/g
<person email="user@gmail.com"></person>
s/(\S+|[^>]+|[^"]+)@gmail\.com/replacement string/g