2016-11-06 66 views
2

我想做一個程序,如果給定的字符串中有兩個破折號,返回前兩個破折號之間的文本。如果它沒有至少兩個破折號,它將返回它不存在。防爆。我有一個字符串如何抓住兩個相同的字符之間的字符串

String s = "I AM -VERY- HUNGRY" 

而我希望我的程序返回非常,這是兩個破折號之間。這是我的代碼到目前爲止

public static String middleText(String sentence) 
    { 
    int count = 0; 
    for (int i = 0; i < sentence.length(); i++) 
    { 
    if (sentence.charAt(i) == '-') 
    { 
     count++; 
    } 
    } 
    if (count >= 2) 
    { 
    return sentence.substring(sentence.indexOf("-") + 1); 
    } 
    else 
    { 
    return "DOES NOT EXIST"; 
    } 
} 

但是,此代碼不會產生我所需的輸出。如果我把這個字符串「I-HUNY-HUNGRY」放到這段代碼中,它會返回「非常飢餓」。我怎樣才能做到這一點,所以它只抓住文字直到第二個破折號?

+0

跟蹤在該指數的特點是 - 。然後,在這些數字之間取一個子串... – Li357

+0

'sentence.indexOf(「 - 」)'返回第一個「 - 」和「substring」的位置,只有一個參數給出從該位置開始直到結束的字符串。 – Sentry

+0

提示:當事情正常時,你的方法應該返回一個** String **。所以返回一個String **錯誤**信息實在是一個壞主意!使用該方法的代碼將不得不檢查返回的字符串是否不存在來確定發生了什麼。不好的風格! – GhostCat

回答

4

您可以使用下面的一行:

return sentence.substring(sentence.indexOf("-")+1, sentence.lastIndexOf("-")); 

另外也可以使用正則表達式。請參閱Regex101的具體正則表達式的鏈接。

-(\w+)- 

它匹配以下:

  • \w+指任何字母至少一個時間+
  • ()是捕獲組
  • -(\w+)-捕獲-字符

聯合PatternMatcher之間的一個或多個字母,以實現的結果。

public static String middleText(String sentence) { 
    Pattern pattern = Pattern.compile("-(\w)-"); 
    Matcher matcher = pattern.matcher(sentence); 
    if (matcher.find()) { 
     return matcher.group(1); 
    } else { 
     return "DOES NOT EXIST"; 
    } 
} 
+1

您是否打算調用'find()'?否則,它只會在字符串開始並以破折號結束時起作用。 – Andreas

+0

是的,我的意思是'find()'。我很抱歉,謝謝你的編輯。 –

1

您可以使用Pattern和Matcher(java.util.regex包)此

String s = "I AM -VERY- HUNGRY"; 
Pattern patter = Pattern.compile("-(.*)-"); 
Matcher matcher = patter.matcher(s); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); // VERY 
} else { 
    System.out.println("no match"); 
} 
+0

如果您使用'find()',則在開始和結束時不需要'。*'。這也更直觀,因爲你真的試圖找到破折號之間的文本。 – Andreas

+0

謝謝@Andreas編輯它 – baao

0

你將要使用indexOf拿到第一個連字符的索引,並lastIndexOf獲得指數最後一個。因此,也許是這樣的:

int firstIndex = sentence.indexOf("-"); 
int lastIndex = sentence.lastIndexOf("-"); 
return sentence.substring(firstIndex+1, lastIndex); 

(注:此代碼沒有經過測試,並且不包括那種錯誤檢查你所提到的)

1

只需使用字符串的方法拆分。 See API here。使用字符串「 - 」作爲分隔符,並且如果你的所得陣列具有長度3或更那麼你的陣列的第二成員是你的結果:

public String myMatchFinder(String arg) { 
    String result = null; 
    String res[] = arg.split("-", 3); 
    if(res.length == 3) { 
     result = res[1]; 
    } else { 
     throw new RuntimeException("No matches found"); 
    } 
    return result; 
} 

如果沒有模式被發現的「其他」塊的工作原理。所以在這種情況下,拋出異常作爲不匹配的指示符,而不是返回一個可能被實際結果混淆的String。 (說你的ARG字符串是「你好,沒有匹配找到了再見」。在這種情況下字符串「找不到匹配」將是你的實際結果)。所以在拋出Exception的時候,你可以在你的調用代碼中捕獲它,並以任何你喜歡的方式將它作爲錯誤處理。

+0

這只是一個新手的簡單示例。所以它會很清楚。我當然不會把它寫成真正的代碼。我也(幾乎)在同一個方法中從來沒有多個回報,但這又是一個快速和骯髒的演示。因此,從技術上講,你是正確的,但你只是在細節選擇,而原則解決方案是正確的,並在視覺上演示 –

+0

好的,這是更好的,我同意 –

+0

只剩下一件事 - 那封郵件中有一個錯字。你應該*解釋*該塊還在做什麼。 – GhostCat

0

而且一條線解決方案......

return Optional.of(sentence) 
    .map(Pattern.compile("(?<=-).*?(?=-)")::matcher) 
    .filter(Matcher::find) 
    .map(Matcher::group) 
    .orElse("DOES NOT EXIST"); 
相關問題