2

我有一个字符串数组,其中一些包含字符'-'。我希望能够搜索它,对于那些包含它的字符串,我希望删除它右侧的所有字符。

例如,如果我有:

$string1 = 'home - London';
$string2 = 'office';
$string3 = 'friend-Manchester';

或类似的东西,那么受影响的字符串将变为:

$string1 = 'home';
$string3 = 'friend';

我不知道'-'之前的空格是否会在之后包含在字符串中(我不想要它,因为我稍后会比较字符串,尽管如果它不影响字符串比较,那么没关系)。

我知道我可以使用以下内容搜索和替换特定的字符串/字符:

$string1 =~ s/-//
or 
$string1 =~ tr/-//

但我对 Perl 中的正则表达式不是很熟悉,所以我不是 100% 确定这些。我环顾四周,'to the right of'在正则表达式中看不到任何关系。帮助表示赞赏!

4

5 回答 5

6

-您可以使用此替换删除连字符后的任何内容:

s/-.*$//s

但是,您将希望删除连字符之前的空格,因此

s/\s* - .* $//xs

$正则表达式锚定在字符串的末尾,/s标志也允许点匹配换行符。虽然$是多余的,但它可能会增加清晰度。

您的替换只会删除第一个-,而您的音译会删除字符串中的所有连字符。

于 2012-10-01T10:01:19.433 回答
3

您的正则表达式只是在搜索破折号,所以这就是它们所替换的全部。你想搜索破折号,以及它后面的任何东西。

$string =~ s/-.*//;

. 表示任意字符,* 表示对该字符搜索 0 次或多次,并尽可能多地匹配(即尽可能匹配到字符串末尾)

您还可以在其前面搜索可选空格。

$string =~ s/\s?-.*//;

(\s 是一种更清晰的指定空格字符的方法)

于 2012-10-01T10:04:48.243 回答
3

使用plain substr()andindex()也是可能的。

my @strings = ("we are - so cool",
               "lonely",
               "friend-Manchester",
               "home - london",
               "home-new york",
               "home with-childeren-first episode");
local $/ = " ";
foreach (@strings) {
  $_ = substr($_,0,index($_,'-')) if (index($_,'-') != -1);
  chomp;
}
于 2012-10-01T11:15:50.900 回答
0

#Using Regex:

my @strings = 
("we are - so cool",
"lonely",
"friend - Manchester",
"home - london",
"home - new york",
"home with-childeren-first episode"
);

foreach (@strings) {
$_ =~ s/-\s*[a-zA-Z ]+\s*//g;
print "NEW: ".$_."\n";
}
于 2012-10-09T10:25:56.710 回答
0

其他答案都很好。但是,根据您所说的:

...如果它不影响字符串比较,那么没关系

您根本不需要单独的步骤。假设您想$string与另一个变量比较$search_string。以下表达式将检查是否完全匹配,除了它忽略$string破折号后的任何内容:

if ($string =~ /^$search_string(\s*-|$)/) { print "Strings matched"; }
于 2012-10-01T10:36:55.227 回答