【发布时间】:2011-09-25 23:37:31
【问题描述】:
我有一个我认为很容易解决的问题,但我无法找到答案。
如何查找和替换字符串中最后一次出现的字符?
我有一个字符串:GE1/0/1,我希望它是:GE1/0:1
说明: 我希望用 : 替换最后一个 / ,无论它之前或之后是什么。
【问题讨论】:
我有一个我认为很容易解决的问题,但我无法找到答案。
如何查找和替换字符串中最后一次出现的字符?
我有一个字符串:GE1/0/1,我希望它是:GE1/0:1
说明: 我希望用 : 替换最后一个 / ,无论它之前或之后是什么。
【问题讨论】:
use strict;
use warnings;
my $a = 'GE1/0/1';
(my $b = $a) =~ s{(.*)/}{$1:}xms;
print "$b\n";
我使用.*的贪婪行为
【讨论】:
也许我不明白可变长度的问题,但我会做以下事情:
你可以用正则表达式匹配你想要的:
(.+)/
所以,这个 Perl 脚本
my $text = 'GE1/0/1';
$text =~ s|(.+)/|$1:|;
print 'Result : '.$text;
将输出:
Result : GE1/0:1
“+”量词默认为“贪婪”,它只会匹配最后一个斜线字符。
希望这就是你要问的。
【讨论】:
这会找到一个斜线并向前看以确保没有更多的斜线经过它。:
原始正则表达式:
/(?=[^/]*$)
我认为代码看起来像这样,但 perl 不是我的语言:
$string =~ s!/(?=[^/]*$)!\:!g;
【讨论】:
“字符串中的最后一次出现”有点模棱两可。在我看来,你的意思可以是:
"Foo: 123, yada: GE1/0/1, Bar: null"
表示“单词”GE1/0/1 中的最后一次出现,或者:
"GE1/0/1"
作为一个完整的字符串。
在后一种情况下,这是一件相当简单的事情,您只需要决定您在正则表达式中的具体程度。
$str =~ s{/(\d+)$}{:$1};
完全没问题,假设最后一个字符只能是数字。
在前一种情况下,我不认为你指的是,但无论如何我都会包括在内,你需要更具体:
$str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2};
【讨论】: