3

"."エスケープ文字がその前に見つかった場合にエスケープする正規表現パターンを見つけるのに苦労していました。"."負の後読みは有望でしたが、以下の構文のように機能しないと思います

String test = "hostname.domain.com/abc/def/v1.8/ghi"

上記の例では、文字列を で分割する"."必要がありますが、URI 部分で v1 と 8 が異なる配列要素として扱われないように、v1.8 をエスケープする必要があります。

String test = "hostname.domain.com/abc/def/v1\\.8/ghi"
test.split("(?!\\\\).");

予想される出力 {"hostname","domain","com/abc/def/v1.8/ghi"} . URI コンテキスト パスを「.」で区切らないでください。「。」が含まれている場合。バージョンを表すだけです。

上記の否定後読み構文は、他の char の like-では機能しますが、 では機能しません"."。エスケープ文字は異なる必要があると思いますが、他のエスケープ文字を追加すると、入力がURIタイプであり、URIの予約済み/特殊文字を先頭に追加する文字として使用したくないため、文字列のさらなる処理で問題が発生する可能性がありますこのため。誰からの考えや助けも大歓迎です。

4

4 に答える 4

4

次の否定先読み正規表現を使用できます。

(?!\\\\)(?:^|.)\\.

または否定的な後読みを使用する:

(?<!\\\\)\\.

オンラインデモ: http://www.rubular.com/r/Sqa2P7A6dRおよびhttp://www.rubular.com/r/xgE7onrwzX

于 2013-07-05T13:13:29.667 に答える
1

この式を試してください

 String[] s = "hostname.domain.com/abc/def/v1.8/ghi".split("(?<!/.{0,99})\\.");
于 2013-07-05T13:16:13.287 に答える
1

正規表現文字列で複数のエスケープ文字が使用されるのを避けるために (エスケープの 1 つのレベルは Java コンパイラによって削除され、もう 1 つのレベルは正規表現エンジンによって削除されます)、文字を角括弧で囲んで「エスケープ」することができます。たとえば\\\\.、より読みやすい[.].

あなたの場合、Java に 2 桁の間にあるドットを使用しないように指示できます。これは小数点記号であるためです。

String test = "hostname.domain.com/abc/def/v1.8/ghi";
for (String s : test.split("(?<!\\d)[.](?!\\d)")) {
    System.out.println(s);
}

これはideoneのデモです。

于 2013-07-05T13:15:43.950 に答える