5

この正規表現に一致する文字列があります:^.+:[0-9]+(\.[0-9]+)*/[0-9]+$として簡単に視覚化できます(Text):(Double)/(Int)。この文字列を 3 つの部分に分割する必要があります。通常、これは簡単ですが、(Text)にコロンが含まれている可能性があるため、コロンで分割することはできませんが、最後のコロンで分割します。

は貪欲なので、すでにこれを行うのはかなりきちんとしていますが、区切り文字の一部として.*my を食べるため、これは String.split() への正規表現としては機能しません。(Text)理想的には、3 つの文字列を含む String[] を返すものが必要です。これには String.split() を使用しなくても 100% 大丈夫です。

4

3 に答える 3

5

私は正規表現が好きではありません (冗談ですが、あまり得意ではありません)。

String s = "asdf:1.0/1"
String text = s.substring(0,s.lastIndexOf(":"));
String doub = s.substring(s.lastIndexOf(":")+1,text.indexOf("/"));
String inte = s.substring(text.indexOf("/")+1,s.length());
于 2012-06-07T21:55:38.157 に答える
3

まっすぐな正規表現を使用しないのはなぜですか?

Pattern p = Pattern.compile("^(.*):([\\d\\.]+)/(\\d+)$");
Matcher m = p.matcher( someString );
if (m.find()) {
  m.group(1); // returns the text before the colon
  m.group(2); // returns the double between the colon and the slash
  m.group(3); // returns the integer after the slash
}

または類似。このパターン^(.*):([\d\.]+)/(\d+)$は、実際には 3 つの位置すべてに値があり、二重位置ではピリオド/ピリオドのみを許可することを前提としているため、仕様に合わせて微調整する必要がある場合があります。

于 2012-06-07T22:00:08.873 に答える
1

String.split()通常、区切り文字と書式設定がより一貫している単純なシナリオで使用され、分割する要素の数がわからない場合に使用されます。

あなたのユースケースでは、昔ながらの正規表現が必要です。文字列の形式がわかっているので、3 つの値を収集する必要があることがわかっています。次のようなことを試してください。

Pattern p = Pattern.compile("(.+):([0-9\\.]+)/([0-9]+)$");
Matcher m = p.matcher(myString);
if (m.find()) {
    String myText = m.group(1);
    String myFloat = m.group(2);
    String myInteger = m.group(3);
}
于 2012-06-07T22:02:01.657 に答える