Perl正则表达式 - 我可以说'如果字符/字符串匹配,删除它以及它的所有权利'吗?

时间:2012-10-01 09:56:21

标签: regex perl replace

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

例如,如果我有:

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

或类似的东西,然后受影响的字符串将成为:

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

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

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

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

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

5 个答案:

答案 0 :(得分:5)

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

s/-.*$//s

但是,您需要在连字符之前删除空格,然后执行

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

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

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

答案 1 :(得分:3)

你的正则表达式只是在搜索短划线,所以他们只需要替换它们。您想要搜索短划线及其后的任何内容。

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

。表示任何字符,*表示搜索该字符0次或更多次,并尽可能多地匹配(如果可能,则匹配到字符串的末尾)

您也可以在它之前搜索可选空格。

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

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

答案 2 :(得分:3)

也可以使用普通substr()index()

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;
}

答案 3 :(得分:0)

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

  

...如果它不影响字符串比较那么无关紧要

根本不需要单独的步骤。假设您要将$string与另一个变量$search_string进行比较。以下表达式将检查完全匹配,但它忽略了短划线后$string之后的任何内容:

if ($string =~ /^$search_string(\s*-|$)/) { print "Strings matched"; }

答案 4 :(得分: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";
}