2016-08-07 3 views
1

私はAndroid(Editext)でJavaコード構文の強調表示を行っています。Regex - 二重引用符内のコメントを選択しないでください

regexを使用してキーワード、リテラル、文字列、数字を強調表示します。 "\"(.*?)\"|'(.*?)'"

コメントの正規表現:

正規表現は、文字列 文字列の正規表現を強調するために使用しています正規表現の選択の"/\\*(?:.|[\\n\\r])*?\\*/|//.*+\\/\\/.*"

シーケンスは、キーワードの正規表現...........文字列の正規表現と最後のコメントです正規表現。正規表現の上

は、通常の文字列やコメントの適切な選択を行っているが、..

問題も強調されます二重引用符の内側

コメントです。 二重引用符で囲まれたコメント選択を無視します。

問題をよりよく理解するための画像を通過(期待出力) 誰もが助けたり、指導してくださいあなたは、単にそれぞれの正規表現のすべての一致を探しているように私にはenter image description here

+0

私たちにいくつかの入力と期待される出力/ハイライトの例を与えることはいいでしょう:) –

+0

@NikolasCharalambidisは素早い応答に感謝します。私は画像で質問を更新しました。どうぞご覧ください:) –

+0

Editextの仕組みはわかりませんが、あなたのルールを交換しようとしましたか?これらの種類の強調表示エンジンは、確実に優先順位を定義する方法を提供します。 –

答えて

3

を理解されるであろう、それはそうです。正規表現がマッチすると、そのマッチングに色付けされます。したがって、前のマッチの色を最後のマッチの色で上書きします。

この問題を解決するには、特定の入力テキストをトークンのストリームに変換できる適切なレクサーを使用する必要があります。次に、トークンストリーム上を実行することができ、着色する必要があるトークンに出会ったら、これを行うことができます。

これは、入力テキストの1つの部分が複数の正規表現とマッチし、複数回カラーリングされるという、現在の問題を防ぎます。これは、入力テキストの各文字がトークンストリーム内の正確に1つのトークンに関連付けられているため、これを防止します。最初の最長一致アルゴリズムを使用しています


レクサーは、次のように機能します。これは、入力テキストの先頭で始まるすべての正規表現の一致を検索します。最長一致を持つ正規表現を選択します。最も長いマッチを共有する複数の正規表現がある場合、最初のものを選択します。これで、レクサーはトークンストリームの最初のトークンを作成します。トークンは、トークンタイプ(正規表現によって与えられる)、マッチの開始位置、マッチの終了位置で構成されます。次に、レクサーは上記を再度実行して次のトークンを検索します。ただし、今回は、前のトークンの最後の位置から開始する一致を検索します。レクサーは、完全な入力テキストがトークンストリームに変換されるまで、または無効な入力に遭遇するまでこれを行います。

ここで重要な部分は、トークンnの終了位置とトークンn + 1の開始位置が同じであることです。したがって、重複がないため、常に1つの色しかありません。

関連する問題