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

プレーン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;
}
于 2012-10-01T11:15:50.900 に答える
0

他の答えは良いです。しかし、あなたが言ったことに照らして:

...文字列の比較に影響しない場合は問題ありません

これには、別の手順はまったく必要ありません。$string別の変数と比較したいとします$search_string$string次の式は、ダッシュの後にあるものをすべて無視することを除いて、完全に一致するかどうかをチェックします。

if ($string =~ /^$search_string(\s*-|$)/) { print "Strings matched"; }
于 2012-10-01T10:36:55.227 に答える
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 に答える