0

のようなものを含む文字列変数がありますABCD.asd.qwe.com:/dir1ABCDの最初から最初の出現までの部分、つまり部分を抽出したい.。問題は、.. だから私はこの正規表現を作成しました。

if($arg =~ /(.*?\.?)/)
{
    my $temp_name = $1;
}

ただし、空白の文字列が表示されます。ロジックは次のとおりです。

.*? - any character non-greedily
\.? - till first or none appearance of .

何が間違っている可能性がありますか?

4

4 に答える 4

3

\.?「の最初またはまったく出現するまで」という意味ではありません..「ここかどうか」という意味です。


文字列の最初の文字が次の場合.:

  • .*?位置 0 の 0 文字に一致します。
  • \.?位置 0 の 1 文字に一致します。

$1が含まれています.


文字列の最初の文字がそうでない場合.:

  • .*?位置 0 の 0 文字に一致します。
  • \.?位置 0 の 0 文字に一致します。

$1空です。


を一致ABCDさせるには、次のようにします。

/^(.*?)\./

ただし、貪欲でない修飾子は嫌いです。同じパターンで 2 つ使用すると、やりたいことをやめるという意味で壊れやすいです。代わりに次を使用します(「非ピリオドに一致」):

/^([^.]*)\./

または単に

/^([^.]*)/
于 2013-05-06T09:19:05.533 に答える
3

代わりに、このような負の文字クラスを使用できます

^[^.]+

[^.]を除く任意の文字に一致します.

[^.]+1 から複数の文字に一致します ( を除く.)

^文字列の開始を示します

また

^.+?(?=\.|$)

(?=)現在の位置の後に特定のパターンをチェックする先読みです..したがってabcdad、正規表現を含むテキストa(?=b)のみaが一致します

$行末 (複数行オプションで使用した場合) または文字列の終わり (単一行オプションで使用した場合) を示します。

于 2013-05-06T09:12:43.397 に答える
2
use strict;

my $string = "ABCD.asd.qwe.com:/dir1";

$string =~ /([^.]+)/;
my $capture = $1;
print"$capture\n";

または、次のようなSplit関数を使用することもできます。

my $sub_string = ( split /\./, $string )[0];
print"$sub_string\n";

一般的な注意: Regex の説明 (複雑な Regex の理解) については、YAPE::Regex::Explainモジュールを参照してください。

于 2013-05-06T09:24:25.837 に答える
0

これはうまくいくはずです:

if($arg =~ /(.*?)\..+/)
{
    my $temp_name = $1; 
} 

それは最初の.. .+入力が最初の .* の後に終了する可能性がある場合は、 を .* に変更できます.。最初.*?の. .+?_.

于 2013-05-06T09:27:00.313 に答える