2017-03-24 4 views
1

イム","":"および例えば"-"クラッシュで複数のシンボルの結果を含む文字列の解析

入力が58,1:2-4であれば、それは次のように生成する必要がありますが含まれているJavaでいくつかの文字を分割しようとしています出力

  1. Booknumber:58
  2. 章番号:1
  3. 本の
  4. 一節= [2,3,4]私はしようとしているコードである続い

private int getBookNumber() { 
     bookNumber = chapterNumber.split("[,]")[0]; 
     return Integer.valueOf(bookNumber); 
    } 

    private int getChapterNumber() { 
     chapterNumber = sample.split("[:]")[0]; 
     verseNumbers = sample.split("[:]")[1]; 
     return Integer.valueOf(chapterNumber); 
    } 

    private List<Integer> getVerseNumbers(String bookValue) { 
     List<Integer> verseNumList = new ArrayList<>(); 
     if (bookValue.contains("-")) { 
      //TODO parse - separated string 
     } else { 
      verseNumList.add(Integer.valueOf(bookValue)); 
     } 

     return verseNumList; 
    } 

Iが呼び出すことになる(2-4 2から4までの値であるため)次のようにそれらを順次

int chapterNumber = getChapterNumber(); 
int bookNumber = getBookNumber(); 
List<Integer> verseNumbers = getVerseNumbers(this.verseNumbers); 

しかし、イムはによって引き起こさ取得:java.lang.NumberFormatException:無効INT:行で "58、1" int chapterNumber = getChapterNumber();

この文字列を解析する効率的な方法はありますか?

+1

あなたの入力ごとにグループ化されて正規表現を使用して、それが入力と一致する場合に有効であり、あなたはあなたがマッチャ意味簡単 –

+0

を入力を抽出することができますでしょうか? –

+0

yea a Pattern、次に対応するMatcherを特定のStringに変換する方法については、http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.htmlを参照してください。このシーケンスは '^(\ https://regex101.com/ –

答えて

2

あなたはこのようgetChapterNumberを変更する必要があります。

private int getChapterNumber() { 
    chapterNumber = sample.split("[:]")[0]; 
    verseNumbers = sample.split("[:]")[1]; 
    return Integer.valueOf(chapterNumber.split("[,]")[1]); 
} 

しかし、最高のマッチャーを使用することです:

String line = "58,1:2-4"; 
Pattern pattern = Pattern.compile("(\\d+),(\\d+):(.*)"); 
Matcher matcher = pattern.matcher(line); 
while (matcher.find()) { 
    System.out.println("group 1: " + matcher.group(1)); 
    System.out.println("group 2: " + matcher.group(2)); 
    System.out.println("group 3: " + matcher.group(3)); 
} 

出力:

group 1: 58 
group 2: 1 
group 3: 2-4 
+0

の最初の解は、魅力のように働きます...(Second D +)、(\ d +)|([\ d] + - [\ d +])ソリューションは素晴らしいです...私は今それを試すことになります...あまりにもありがとう –

+0

ブロ... urそのような天才..秒の方法は完璧で最高です –

1

私はこれに近づくかもしれませんベース文字列メソッドを使用してavo正規表現マッチャーに付属しているID重機:

String input = "58,1:2-4"; 
int commaIndex = input.indexOf(","); 
int colonIndex = input.indexOf(":"); 
int bookNumber = Integer.valueOf(input.substring(0, commaIndex)); 
int chapterNumber = Integer.valueOf(input.substring(commaIndex+1, colonIndex)); 
String verseString = input.substring(colonIndex+1); 
String[] verses = verseString.split("-"); 
int startVerse = Integer.valueOf(verses[0]); 
int endVerse = Integer.valueOf(verses[1]); 
int[] allVerses = new int[endVerse - startVerse + 1]; 
for (int i=0; i < allVerses.length; ++i) { 
    allVerses[i] = startVerse + i; 
} 
+0

正規表現は時間の複雑さの多くを持っていますか? –

+0

私はいくつかの聖書のテキストを解析していると仮定しています。あなたが常に参照のための同じパターンを解析していることが確かで、それが決して変更されないなら、私は答えをオプションとして考えるかもしれません。コードの可読性とメンテナンスの観点から、@Legaによって与えられた答えが行く方法です。 –

+0

私の答えはおそらく正規表現を使うよりも速く実行されると思いますが、私の意見ではコードの優先順位がこれを上回ります。 –

関連する問題