2015-11-12 91 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

相关问题