3

sprintfコード内でその単語を見つけたい。どの Perl 正規表現を使用する必要がありますか? のようなテキストを含む行がいくつかありますがsprintf_private、これは除外したいのですが、必要なのはsprintf.

4

2 に答える 2

21

\b単語の境界で使用する必要があります:

/\bsprintf\b/
于 2012-07-27T07:58:30.257 に答える
7

sprintfを含まない on 行をすべて見つけたい場合はsprintf_private、正規表現のペアを使用できます。

while( my $line = <DATA> ) {
    next if $line =~ m/\bsprintf_private\b/;
    while( $line =~ m/\bsprintf\b/g ) {
        print "[sprintf] found on line $. at column $-[0]\n";
    }
}

これは、最初に を含む行を拒否しますsprintf_private。次に、その不適格条件を含まない行がスキャンされ、すべての が出現しsprintfます。それが見つかった場合は、ファイル内の行と見つかった一致の開始列を識別するメッセージが出力されますsprintf

および特殊変数はperlvar$.で説明されています。また、正規表現に関する読み物はperlrequickperlretutにあります。最初の正規表現は非常に単純です。ゼロ幅アサーションを使用して、不適格な部分文字列の両側に単語境界があることを確認するだけです。2 番目の正規表現は同じ手法を使用しますが、修飾子を適用して、 1 行に複数回出現する場合に備えて、すべての出現を反復処理します。@-\b/gsprintf

ゼロ幅アサーションは、または遷移が発生する\b場所ならどこでも一致します。文字クラスにはすべての英字 (「すべて」を構成するものは、フラグまたはによって異なります) に加えて、アンダースコアと数字 (つまり、識別子で許容される文字) がすべて含まれているため、単語の境界が制限的すぎると感じる場合があります。「単純な」解決策が単純すぎるとわかった場合は、さらに一歩進んで、次のような正規表現を使用して、単語境界と見なされるものを実際に絞り込むことができます。\w\W\W\w\wunicode_strings/u\b

(?<!\p{Alpha})sprintf(?!\p{Alpha})

このルートを選択した場合、ソリューションは次のようになります。

while( my $line = <DATA> ) {
    next if $line =~ m/(?<!\p{Alpha})sprintf_private(?!\p{Alpha})/;
    while( $line =~ m/(?<!\p{Alpha})sprintf(?!\p{Alpha})/g ) {
        print "[sprintf] found on line $. at column $-[0]\n";
    }
}

これは、ゼロ幅の負の後読みアサーションとゼロ幅の負の先読みアサーションを使用して、プライマリ部分文字列のすぐ左または右にある文字が「アルファ」文字である一致を拒否し\bます。

于 2012-07-27T08:10:01.120 に答える