2015-11-12 93 views
2

結束例如算一個字符出現的所有除了在字符串

String text = "sentence";  // (number of e's = 2) 

有三名辰在該字符串,但結果應該是2因爲第三個是在最後。這是我到目前爲止有:

public static void main(String[] args) { 
    int count =0; 
    String text = "sentence"; 
    Pattern pat = Pattern.compile("[e]+"); 
    Matcher m = pat.matcher(text); 
    while (m.find()) { 
     count++; 
    } 
    System.out.println(count); 
} 
+2

你可以在應用正則表達式沒有最後一個字符的子字符串 –

+1

你必須使用正則表達式嗎?這項任務接近於更適合簡單的循環。 –

+0

你能解釋一下如何使用。我需要計算e的中間值,但不應該把這個e作爲它的最後一個字符。 –

回答

3

更換+它存在e後負先行。 e+匹配一個或多個e's,所以正則表達式引擎應該考慮eee作爲單個匹配。而在e之後出現負向預測,即e(?!$)有助於找到所有的e,但不是排在最後的那個。

int count = 0; 
String text = "sentence"; 
Pattern pat = Pattern.compile("e(?!$)"); 
Matcher m = pat.matcher(text); 
while (m.find()) { 
     count++; 
} 
System.out.println(count); 
+0

工作正常。可以解釋 –

+0

@JagadeeshSinde'(?!x)'是否爲負面查找表,在前面,意思是「沒有跟着'x'」。在這種情況下,'x'是'$',它與文本結尾匹配,因此完整意味着「沒有文本結束的e」。 – Andreas

+0

如果輸入文本有多個單詞它將工作。示例輸入:字符串文本=「句子是」(輸出應該是2)。代碼不適用於這種類型的輸入。 –

0

Matcher方法可以告訴你在比賽的開始和結束索引。如果結尾(後面的下一個字符)匹配字符串的長度,那麼它是最後一個字符。例如。

int count =0; 
String text = "sentence"; 
Pattern pat = Pattern.compile("e"); 
Matcher m = pat.matcher(text); 
while (m.find() && m.end() != text.length()) { 
    count++; 
} 
System.out.println(count); 

如果你想從一個字,而不是句子的最後一個單詞的最後一個字母計數排除,您可以檢查結束字符是字母:

int count =0; 
String text = "sentence"; 
Pattern pat = Pattern.compile("e"); 
Matcher m = pat.matcher(text); 
while (m.find() && 
     m.end() != text.length() && 
     Character.isAlphabetic(text.charAt(m.end()))) { 
    count++; 
} 
System.out.println(count); 
+0

只會對' beet',並且它會被計數爲0,因爲它們分別爲2和1 – Andreas

+0

這實際上是'[e] +'的問題'它只會連續匹配'e'只需移除'+' '我會編輯 –

+0

在OP對現在被接受的答案的評論中,OP改變了要求,在詞的結尾而不是結尾處排除「e」。難道你不喜歡(!)不斷變化的需求? – Andreas

相關問題