1

私は Alex Gorbatchev の Syntax Highlighter のブラシを書いて、Smalltalk コードのハイライトを取得しています。ここで、次の Smalltalk コードを検討してください。

aCollection do: [ :each | each shout ]

ブロック引数 ":each" を見つけて、その後発生するたびに "each" と一致させたい (簡単にするために、括弧内だけでなく、すべての発生としましょう)。引数には、":myArg" など、任意の名前を付けることができることに注意してください。

「:each」に一致する私の試み:

\:([\d\w]+)

これはうまくいくようです。問題は、「each」の出現を一致させることです。私はこのようなものがうまくいくと思った:

\:([\d\w]+)|\1

しかし、交互の右辺は独立した式として扱われているようで、後方参照は機能しません。

単一の式で私が望むことを達成することさえ可能ですか? それとも、(別の関数呼び出しを介して) 2 番目の式内で後方参照を使用する必要がありますか?

4

2 に答える 2

0

可変長の後読みをサポートする言語でそれを行うことができます(私の知る限り、.NETフレームワーク言語のみがサポートしていますが、Perl 6はそうかもしれません)一致する場合は、単語を強調表示できます(?<=:(\w+)\b.*)\1。しかし、JavaScript は後読みをまったくサポートしていません。

とにかく、この正規表現は非常に非効率的です (RegexBuddy で簡単な例を確認したところ、正規表現エンジンは、ドキュメント内のほぼすべての文字が一致するかどうかを判断するために 60 以上のステップを必要とします)。したがって、これは良い考えではありません。コードの強調表示に使用する場合。

あなたが言及した2段階のアプローチを使用することをお勧めします.最初の一致:(\w+)\b(安全のために挿入された単語境界は、\dで暗示されて\wいます)、次に一致結果のリテラル検索を行い\1ます。

于 2010-04-20T14:04:44.560 に答える
0

一致の間に正規表現エンジンによって保存されるのは、最後の一致の位置だけだと思います。したがって、次の一致を探す場合、前の一致への後方参照を使用することはできません。

だから、いいえ、私はこれが可能だとは思いません。

于 2010-04-20T14:04:45.100 に答える