Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Regex Perl正则表达式替换问题_Regex_Perl - Fatal编程技术网

Regex Perl正则表达式替换问题

Regex Perl正则表达式替换问题,regex,perl,Regex,Perl,我试图使用正则表达式从分号分隔的字符串中删除标记。字符串示例如下所示: 字段1=废话;Field2=蓝色;字段3=定东;Uid=约翰;Pwd=秘密;字段4=lalali 字段1=废话;Field2=蓝色;字段3=定东;Uid=约翰;Pwd=秘密;Field4=lalali 因此,我想在单独的命令中删除Uid和Pwd标记,以避免删除任何后续标记,例如Field4应保留在末尾 我目前的努力是: $mystring=~s/Uid=.+//一, 产生 字段1=废话;Field2=蓝色;字段3=定东;字段

我试图使用正则表达式从分号分隔的字符串中删除标记。字符串示例如下所示:

字段1=废话;Field2=蓝色;字段3=定东;Uid=约翰;Pwd=秘密;字段4=lalali 字段1=废话;Field2=蓝色;字段3=定东;Uid=约翰;Pwd=秘密;Field4=lalali

因此,我想在单独的命令中删除Uid和Pwd标记,以避免删除任何后续标记,例如Field4应保留在末尾

我目前的努力是:

$mystring=~s/Uid=.+//一,

产生

字段1=废话;Field2=蓝色;字段3=定东;字段4=lalali

它适用于第一行,但不适用于结尾带有分号的第二行

字段1=废话;Field2=蓝色;字段3=定东

并错误地删除字段4。我尝试了很多变化,比如

$mystring=~s/Uid=.+//我 $mystring=~s/Uid=.+;+//一,

没有成功。我意识到我需要告诉正则表达式只匹配第一个分号,但我不知道如何匹配

现在,为了让我看起来不那么愚蠢,我可以通过这样做让它工作:

$mystring=~s/Uid=[^;]+//一,


但是我仍然想知道为什么我不能告诉表达式只匹配第一个分号…

如果你不想使用否定字符类,这将适用于大多数正则表达式包,你可以使用非贪婪量词来匹配关键字后面的数据,但它只适用于Perl兼容的正则表达式包。有关更多信息,请参见下的量词

$mystring =~s /Uid=.+?;//i;

额外的问号使+不贪婪;它采用将匹配的最小字符串而不是最大字符串,因此它不会匹配任何分号。

当您使用+或*之类的量词时,它们是贪婪的。它们会尽可能多地吞噬角色,只有在被迫回溯时才会归还。模式;因此将匹配所有内容,直到最后一个分号

也许贪婪的量词应该节食。我们可以通过使用惰性版本强制他们:+?和*?。这些协议将尽早终止。因此,模式将是:

/Uid=.+?;/  # repeat for Pwd
哪个匹配直到第一个分号

这是可行的,但使用否定的字符类而不是非贪婪的带。类别:


因为有更少的方法可以出错,比如删除行的其余部分。它也比其他解决方案更明确。

?我做错什么了吗?请,尊敬的选民,开导我…我不是需要代表,我想知道这个答案如何更有用
/Uid=[^;]+;/