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=定东;字段4=lalali 它适用于第一行,但不适用于结尾带有分号的第二行 字段1=废话;Field2=蓝色;字段3=定东 并错误地删除字段4。我尝试了很多变化,比如 $mystring=~s/Uid=.+//我 $mystring=~s/Uid=.+;+//一, 没有成功。我意识到我需要告诉正则表达式只匹配第一个分号,但我不知道如何匹配 现在,为了让我看起来不那么愚蠢,我可以通过这样做让它工作: $mystring=~s/Uid=[^;]+//一,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=定东;字段
但是我仍然想知道为什么我不能告诉表达式只匹配第一个分号…如果你不想使用否定字符类,这将适用于大多数正则表达式包,你可以使用非贪婪量词来匹配关键字后面的数据,但它只适用于Perl兼容的正则表达式包。有关更多信息,请参见下的量词
$mystring =~s /Uid=.+?;//i;
额外的问号使+不贪婪;它采用将匹配的最小字符串而不是最大字符串,因此它不会匹配任何分号。当您使用+或*之类的量词时,它们是贪婪的。它们会尽可能多地吞噬角色,只有在被迫回溯时才会归还。模式;因此将匹配所有内容,直到最后一个分号 也许贪婪的量词应该节食。我们可以通过使用惰性版本强制他们:+?和*?。这些协议将尽早终止。因此,模式将是:
/Uid=.+?;/ # repeat for Pwd
哪个匹配直到第一个分号
这是可行的,但使用否定的字符类而不是非贪婪的带。类别:
因为有更少的方法可以出错,比如删除行的其余部分。它也比其他解决方案更明确。?我做错什么了吗?请,尊敬的选民,开导我…我不是需要代表,我想知道这个答案如何更有用
/Uid=[^;]+;/