-3

or演算子なしでこのコードを書き直そうとしています。

    if((/^\s*field\s+{\s*$/)||(/^\s*field\s+{\s*\/\/.*$/)
    {
        # Do something
    }  
4

2 に答える 2

2

ルールはあまり明確に指定されていませんが、簡単な方法でこれらの行をキャプチャできます。

^text[1-3]

これにより、がセットの1つであるtextN単語で始まるすべての行が取得されます。これは、正規表現機能でも実現可能であるという事実に基づいている可能性が最も高いようです。N{1,2,3}|

^(text1|text2|text3)

ただし、前述のように、仕様はそれほど詳細ではなかったため、何をキャプチャしたいかはわかりません。誤解される可能性のある単なる例ではなく、キャプチャする必要のある正確なルールを指定する必要があります。


さて、あなたのコメントの1つの後、それは意味をなし始めます:

C ++のようなファイルを解析していて、パーサーをコメント行とコメントなし行(単一行コメント)の両方に一致させたいです。

したがって、有効な行末コメントのある行またはコメントのない行のいずれかを探しています//

コメントのキーワードは「解析」です。真剣に、コードが非常に単純になることがわかっている場合を除いて、正規表現を使用してこれを実行しようとしないでください。解析する場合は、パーサーが必要です。簡潔でシンプル。実際、単純なコードであっても、パーサーを使用することをお勧めします。

例:次の完全に有効な行で何をしますか:

int ratio = height
                  /
                   width;
char *description = "This program will look for '//' markers";
int myvar = text1 / comment;

C ++のような言語が非常に単純であると仮定すると(たとえば、//行末にコメント以外の文字がない場合)、//.$コメントが表示されないように、初期パスで各行の終わりを削除することができます。後のパスで。

ただし、これは構文/文法に対するかなり厳しい制限であり、それを課すことができない限り、レクサー/パーサーが最善の方法です。

于 2011-12-13T02:01:21.273 に答える
0

書き直そうとしている場合

(/^\s*field\s+{\s*$/) || (/^\s*field\s+{\s*\/\/.*$/)

私が提案するかもしれません:

m#^\s*field\s+{\s*($|//)#

最後の部分($|//)では、2つの有効な行末(行末のみ、または2つのスラッシュ)のいずれかを探します。スラッシュの後には、を書いたかのように任意の文字を続けることができることに注意してください//.*$

于 2011-12-13T02:44:18.083 に答える