0

私は次の変数を持っています。変数に「imoport/canada / campingplaces / tobermory」があり、#などがない場合にのみ、yesを出力します。この種のものの正規表現に何を挿入する必要がありますか。

  my $textfile = "# imoport/canada/campingplaces/tobermory
                    imoport/canada/campingplaces/tobermory
                  #imoport/canada/campingplaces/tobermory";
  my $textNeeded= "imoport/canada/campingplaces/tobermory"

これは私が使用しているものです

  if ($textfile =~ m/$textNeeded/i) {
       print "yes working"

  }

注:-異なるテキストファイルからデータを取得しているため、一部のテキストファイルには「#imoport / canada / campingplaces/tobermory」が含まれている可能性があります。それらを避けたい

4

3 に答える 3

3

かなり漠然とした問題の説明にもかかわらず、私はあなたが何を意味するのか戸惑ったと思います。つまり、テキストがコメントアウトされている行があり、#それらとの一致を避けたいということです。

print "yes" if $textfile =~ /^\s*$textNeeded/im;

$textfileこれは、改行、オプションの空白、文字列が続く文字列と一致します。この/mオプションは、正規表現を複数行にします。つまり、より大きな文字列内の改行で表される行末^に一致します。$

検索文字列内の正規表現メタ文字に注意することをお勧めします。たとえば、検索文字列がであるfoo[bar].txt場合、それらの括弧は代わりに文字クラスとして解釈されます。その場合、あなたは使用します

/^\s*\Q$textNeeded\E/im

代わりは。は\Q ... \E、内部のテキストをリテラル文字のみに一致させます。

于 2012-06-01T17:43:55.487 に答える
1

ターゲット文字列が行の先頭に表示されている場合は、一致するようにアンカーを作成する必要があると思います。これは、アップカラット記号を使用します。

if($ textfile =〜m / ^ $ textNeeded / i){print "yes working"

}

textNeeded文字列の前にスペースまたはタブがある場合、これは一致を報告しません。

于 2012-06-01T17:30:10.963 に答える
0

先頭のハッシュがない行を単純に返すには、次のようにします。

my $textfile = "# imoport/canada/campingplaces/tobermory
                    imoport/canada/campingplaces/tobermory
                  #imoport/canada/campingplaces/tobermory";

for (split /^/, $textfile) {
  print $_ if(m/^\s*[a-zA-Z].*/);
}

戻り値:

                imoport/canada/campingplaces/tobermory
于 2012-06-01T17:52:55.190 に答える