2010-07-28 108 views
8

我们有一个字符串输入及以下组合是有效的(例如sunday*sunday*sun*day**sun*daysu*nda*y) 如果只包含一个星号,那么这是一个错误的输入。如何检查一个字符串是否包含两个星号字符?

因此,鉴于上述输入,如何检查字符串是否包含多个星号。

+3

至少有两个或两个? – 2010-07-28 07:45:01

+0

它应该恰好是两个 – Achaius 2010-07-28 09:12:02

回答

4

你可以使用String.matches使用正则表达式:

"^.*(?:\\*.*){2}$" 

如果你想正是两个星号:

"^[^*]*(?:\\*[^*]*){2}$" 

虽然这项任务可能是简单的只是遍历字符串和计数星号。

+2

任何人都可以请解释这个正则表达式吗? – ederollora 2014-03-11 18:43:55

3

至少有两种方式:

  • 正则表达式

    String regex = ".*\\*.*\\*.*"; 
    boolean valid = input.matches(regex); 
    
  • int asterisks = 0; 
    for (int i = 0; i < input.length(); i ++) { 
        if (input.charAt(i) == '*') { 
         asterisks++; 
        } 
    } 
    
+0

您可以从正则表达式的前面和末尾移除'。*',并使用'find()'来代替。这实际上可能会快一点。 – 2010-07-28 11:41:28

9
int asterisk1 = input.indexOf('*'); 
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1; 

编辑:此解决方案假定要求是“至少有两个星号”。

2
boolean hasTwoAsteriks(String str) { 
int i; 
if((i = str.indexOf("*")) != -1) { 
    if ((i = str.indexOf("*", i+1)) != -1) 
    return true; 
return false; 
}
3

这里是与任何文字字符串工作的非正则表达式的选择:

public static boolean containsNoneOrTwo(String haystack, String needle) { 
    int index = haystack.indexOf(needle); 
    return (index == -1) || 
     haystack.indexOf(needle, index+1) == haystack.lastIndexOf(needle); 
} 

本质的算法是:

containsNoneOrTwo(haystack, needle) 
    = haystack contains no needle OR 
     haystack's second needle is also its last 
+1

并修改它以检查*正好两个星号*,只需将第三行更改为'return(index!= -1)&&'。 – 2010-07-28 10:45:39

0

为了完整(虽然有几个很好的答案已经被提供,我喜欢Mark's和Joachim的最好),这里有两个版本,基于String.split(regex)String.split(regex, limit)

(编辑,bug修复:)

boolean containsAtLeastTwoAsterisks = ("_" + myString + "_").split("\\*", 3).length == 3; 

boolean containsExactlyTwoAsterisks = ("_" + myString + "_").split("\\*").length == 3; 

我根据我们的答案(我知道,基准意义已经不大,但它们很有趣,而我可能是废话,我知道写a little benchmark )无论如何,这里是一个样本运行的结果:

********************************************************************************* 

Testing strings with one or less asterisk 

Processor: bhups 
Finished. Duration: 40 ms, errors: 0 

Processor: Bozho (loop version) 
Finished. Duration: 33 ms, errors: 0 

Processor: Bozho (regex version) 
Finished. Duration: 806 ms, errors: 0 

Processor: Joachim Sauer 
Finished. Duration: 24 ms, errors: 0 <-- winner 

Processor: Mark Byers 
Finished. Duration: 1068 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 408 ms, errors: 0 

********************************************************************************* 

Testing strings with exactly two asterisks 

Processor: bhups 
Finished. Duration: 14 ms, errors: 0 <-- winner 

Processor: Bozho (loop version) 
Finished. Duration: 21 ms, errors: 0 

Processor: Bozho (regex version) 
Finished. Duration: 693 ms, errors: 0 

Processor: Joachim Sauer 
Finished. Duration: 14 ms, errors: 0 <-- winner 

Processor: Mark Byers 
Finished. Duration: 491 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 340 ms, errors: 0 

********************************************************************************* 

Testing strings with more than two asterisks (not all processors will be included) 

Skipping processor bhups 

Processor: Bozho (loop version) 
Finished. Duration: 63 ms, errors: 0 <-- winner 

Skipping processor Bozho (regex version) 

Skipping processor Joachim Sauer 

Processor: Mark Byers 
Finished. Duration: 1555 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 860 ms, errors: 0 

似乎非正则表达式比正则表达式快很多。这就是你期望的,我猜。

编辑:修正了错误的赢家。对不起,约阿希姆

+0

是33 <24? ;-) – 2010-07-28 10:47:25

+0

你是对的,我在阅读你的评论前自己找到了。修复。 – 2010-07-28 10:56:20

相关问题