1

テキストファイルで識別子を見つける必要があります。

ただし、識別子がキーワードの場合は一致させたくありません。たとえば、キーワードとして「for」がある場合、次のようになります。

for (i=0 ; i< max ; i++)

私は得る必要があります:

Found: i
Found: i
Found: max
Found: i

先読みアサーションを調べましたが、機能させることができません。

$IDENTIFIER="(?!(for|while|do))[a-zA-Z_]+[a-zA-Z0-9_]*"
    while ($entireFile =~ /($IDENTIFIER)/g)
    {
          print "Found ($1)" . "\n"; 
    } 

私は得る:

Found: or
Found: i
Found: i
Found: max
Found: i

これは私が望むものは静かではありません!なぜ「または」を取得するのかは理解できますが、どうすればそれをよりスマートにして「for」を完全に除外できますか?

4

3 に答える 3

1

Perl でさえ、明快さは重要です。テストを読みやすく、更新しやすくするために、単語検索の正規表現をキーワード フィルターから分離することをお勧めします。表現。次に例を示します。

use strict;
use warnings;

my $entireFile = "for (i=0 ; i< max ; i++)";
my @KEYWORDS = ('for', 'while', 'do');

while ($entireFile =~ /([a-zA-Z_][a-zA-Z0-9_]*)/g)
{
    my $is_keyword = 0;
    for my $keyword (@KEYWORDS) 
    {
        if ($1 eq $keyword) 
        {
            $is_keyword = 1;
        }
    }
    if (not $is_keyword) 
    {
        print "Found ($1)" . "\n";
    }
}
于 2012-08-17T02:08:04.960 に答える
1

単語全体(潜在的な識別子)と一致していることを確認するには、アンカーが必要です。最初の概算では、/\b(?!(?:for|while|do)\b)[A-Za-z_][A-Za-z0-9_]*\b/実際に必要なことを行います。

于 2012-08-17T02:31:24.760 に答える
0

コメントを探している可能性があるため、識別子のように見えるものを探すことはできません。識別子が発生する可能性のある識別子のみを探します。"f" の直後に識別子を指定することはできません。言い換えれば、本当の問題は、問題を固定していないことです。

問題が表示されていないため、問題の解決をお手伝いすることはできません。あなたの質問にやみくもに答えることができます:

$ID_START = "[a-zA-Z_]";
$ID_CONT  = "[a-zA-Z0-9_]";
$IDENT    = "(?<!$ID_START)(?<!$ID_CONT)(?!(?:for|while|do)(?!$ID_CONT))$ID_START$ID_CONT+";

(これにより、「完了」が「実行」と同じように扱われなかった問題も修正されます。)

于 2012-08-17T01:45:38.773 に答える