2017-08-03 4 views
0

を使用してスペースと引用符で文字列の部分文字列を取得します。私は次の文字列を持っていると私のルールの説明は次のようになります。つまり、ルールの内容を抽出したいIndexOfメソッド

rule "My Rule Description Looks Like This"  
     followed by some white space other characters such as quotes". 

私は、次を使用する場合、私が取得java.lang.StringIndexOutOfBoundsException:範囲外の文字列インデックス:-2:

String ruleName = rule.substring(rule.indexOf("rule \"" + 7, rule.indexOf("\"")); 

iはのlastIndexOfを使用:

String ruleName = rule.substring(rule.indexOf("rule \"" + 7, rule.lastIndexOf("\"")); 

コードはOK実行しますが、出力は次のようになります。

My Rule Description Looks Like This"   
     followed by some white space other characters and quotes 

最初のオプションは、のindexOfを使用して例外をスローなぜ任意のアイデア?

+2

あなたは 'substring(11、4)'のようなものを呼び出しています – Nathan

+0

あなたの部分文字列呼び出しはコンパイルされません。 –

+0

誰も "ルール" + "7"は文字通り "ルール" 7 "' –

答えて

2

どのような種類の複雑なテキスト抽出でも、正規表現の使用を検討することをおすすめします。ここでは、ルールを抽出することができる短いスクリプトがあります。これは、あなたが見たように、エラーを起こす可能性のある不快な文字列操作を回避します。

String line = "rule \"My Rule Description Looks Like This\"\n"; 
line += "followed by some white space other characters such as quotes\"."; 
String pattern = "rule\\s+\"(.*?)\".*"; 

Pattern r = Pattern.compile(pattern, Pattern.DOTALL); 
Matcher m = r.matcher(line); 
if (m.find()) { 
    System.out.println("Found a rule: " + m.group(1)); 
} else { 
    System.out.println("Could not find a rule."); 
} 

出力:ここ

My Rule Description Looks Like This 

デモ:the documentationから

Rextester

+0

説明をお寄せいただきありがとうございます。代わりにパターンを使用します。 – Orby

+0

'String#substring()'で間違っていた箇所を見たい場合は、他の答えをチェックしてください。しかし、あなたの要件がこれよりも複雑になるならば、おそらく正規表現はあなたの時間のより良い投資でしょう。 –

0

パブリックストリングストリング(INT beginIndexパラメータ、INT endIndexの)

beginIndexが負である、またはendIndexがこのStringオブジェクトの長さよりも大きい、またはbeginIndexがendIndexより大きい場合。

rule.substring(rule.indexOf("rule \"" + 7, rule.indexOf("\""))に電話しています。最初のパラメータは、最初のrule + quoteのインデックスを返します。x、+ 7としましょう.2番目のパラメータは、x + 6x - 文字の数はrule)です。したがって、substring (x + 7, x +6)を呼び出しています。その例外ケースに落ちる:秒より

最初のパラメータbigerをあなたrsecond場合

lastIndexOfを使用して、あなたはこの問題を持っていないので、あなたは、二重引用符を取得しています。

+0

これは間違っています。 indexOfの最初のパラメータは文字列です。したがって、 "ルール" + "7"は文字通り文字列 "ルール" 7 "' –

+0

@MichaelMarkidis彼は例外があり、エラーではないので、彼は 'String ruleName = rule.substring(rule。 indexOf( "rule \" ")+ 7、rule.indexOf(" \ "")); '。 – Nathan

0

indexOfは、指定されたStringの最初のオカレンスののインデックスを返します。

最初の例では、インデックス7から始まる部分文字列を試します(0は文字列が見つかった場所のインデックスで、次に7を追加します)。インデックス5(最初の "が見つかった場所)で終了します。

端指標から減算開始インデックスは、値とStringIndexOutOfBoundsExceptionがスローされある場合、その中のいくつかのロジックがどこたsubstring(int beginIndex, int endIndex)方法

int subLen = endIndex - beginIndex; 
if (subLen < 0) { 
    throw new StringIndexOutOfBoundsException(subLen); 
} 

あなたの第二の例では、スローしないにあなたがlastIndexOf()を使用しているため(がある場合「)例外は、それは文字列の末尾に7から部分だろう。

最善の解決策は、正規表現パターンを使用することです@Tim Biegeleisenの答えに示すよう

関連する問題