3

次の(Delphi RTTI出力)を名前空間区切り文字で分割しようとしています.

System.Generics.Collections.TEnumerator<Utils.TPair<System.string,System.string>>

正しい分割はです[System, Generics, Collections, TEnumerator<Utils.TPair<System.string,System.string>>]

最初にネガティブな先読みを試しましたが、それはの期間と左端の\.(?!\<*[a-zA-Z0-9_.,]*\>)両方に一致しました。私は少し驚いています、私はそれが(正しく)の期間と一致したことを付け加えるかもしれません。これは、正規表現言語の私のコマンドの証拠だと思います。Utils.TPairSystem.stringCollections.TEnumerator

そこで、次のように言って「貪欲」にしようとし\.(?!\<*[a-zA-Z0-9_.,<>]*\>)ましたが、一致するものが見つかりませんでした。(これは、regexersが「貪欲」と言うときに通常意味することではないことを私は知っていますが、私はより適切な説明を思い付くことができませんでした。)

そこで、最初からやり直すことにしました。私が理解している限り、私は自分のケースを解決するためにネガティブなルックアラウンドを使用できるはずです。特に、次の一致<は事実上無視できます。だから私は(?<!\<[a-zA-Z0-9_]*)\.自分の問題を解決すべきだと決めました。そうではありません。これはおそらく、(多くの)ネガティブルックビハインド実装が可変長文字列をサポートしていないという事実によるものです。(具体的には、PCRE-基本的にDelphiが使用するものであり、明らかに可変長の代替をサポートします。ただし、すべての代替は実行時に修正する必要があります。)

したがって、私はあなた、コミュニティに目を向けます。

誰かがこの問題に光を当てることができますか?それは実際には非常に単純なはずです。素晴らしいことだ!

4

1 に答える 1

4

この正規表現を試してください:

\.(?![^.]*[\w_.,]*>)

これは基本的に次のことを意味します。undの前にあるaが.後に続かないものすべてに一致し、したがって。内にある。それは実際にはあなたの例に非常に限定されています。.><>

rubularを参照してください

ネガティブな後読みは、このタスクをより適切に解決できます。

(?<!<.{0,1000})\.

.これは、前に前がないものと一致することを意味<します。

私はこれをJavaで試しましたが、動作します。Javaでは無制限のルックビハインドを使用できません。そのため、の{0,1000}代わりに1000の制限を使用しました*。PCREがサポートしているかどうかはわかりません。

于 2012-09-17T14:50:42.800 に答える