2017-01-14 18 views
0

他の質問から探していますが、回答を見つけることができませんでした。私はANTLR4の文法に取り組んでいます。正規表現は私を逃しています。正規表現では特定のエスケープ文字のみを許可します

\)以外の文字はと一致させようとしていますが、それに続く[btnrf"\]以外は一致しています。

私は(~([\\][.]) | [\\][btnrf"\])を試しましたが、~は、私が知る限り、ただ1文字を否定します。私はエラーを取得する:

error AC0050: extraneous input '[.]' expecting RPAREN while looking for lexer rule element

\*を除外するが、許容可能なエスケープ文字の小さなリストを許可するにはあまりにも難しいことではありませんように思え。私はhttp://www.regex101.comにいて、許容される文字と一致する問題はありませんが、何らかの理由で、上記以外のエスケープ文字を禁止する方法を理解できず、他のすべての文字も許可します。

すべての有効な入力文字を手動で指定することは、過剰使用のように思えますが、それが原因である可能性があります。ような何か:100%有効ではない可能性があり

[[email protected]#$%^&*()\-+=/.,<>;':\b\t\n\r\f\"\\]*

が、アイデアは単にデフォルトで無効なエスケープ文字を排除する有効なすべての可能な文字を、一覧表示されます。よりシンプルな方法があるはずです。役に立つ情報へのヒントやリンクがあれば幸いです。

私がこれまで持っている実際のルール、何が有効な文字列として二重引用符で囲まれたことを可能にする:

STRING : '"' (~[\"] | '\\"')* '"'; 
+0

私は理解していない何あなたはどのキャラクターを否定しようとしていますか? –

+0

私はすべての通常の文字を許可し、上記の文字以外のすべてのエスケープ文字を許可しないようにしようとしています。したがって、 '\ t'や' \ "は有効ですが、' \ u'はそうではありません。 –

答えて

1

私はANTLRは手元にありませんが、以下は、あなたがしている何をやっているようです後:

\([^\\].\)\|\(\\[btnrf\\"\\\\]\) 

ので、効果的に「任意の文字が続くバックスラッシュ以外、または指定した文字が続くバックスラッシュのどちらかを」許可します。ファイルregexfileにその文字列を入れて

例えば、その後、grep -f regexfile datafileは\ aを除外して、戻ります実行

\a 
\b 
\\ 
xy 

を含むデータ・ファイルを与えられた:

\b 
\\ 
xy 
+0

ああ、これはまさに私が探していたものです。 –

+0

私が遭遇した1つの軽微な問題二重引用符は合法ではありませんバックスラッシュが前に付いていない限り '.'の代わりに' [^ "]'を追加しようとしましたが、正しく働く –

関連する問題