Java 如何检查字符串是否包含两个星号字符?

Java 如何检查字符串是否包含两个星号字符?,java,string,Java,String,我们有一个字符串输入,以下组合有效(例如,sunday,*sunday*,sun*day*,*sun*day,su*nda*y) 如果它只包含一个星号,那么它是一个错误的输入 鉴于上述输入,如何检查字符串是否包含多个星号。至少有两种方法: int asterisk1 = input.indexOf('*'); boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1; b

我们有一个字符串输入,以下组合有效(例如,
sunday
*sunday*
sun*day*
*sun*day
su*nda*y
) 如果它只包含一个星号,那么它是一个错误的输入

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

至少有两种方法:

int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;
boolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
  if ((i = str.indexOf("*", i+1)) != -1)
    return true;
return false;
}
  • 正则表达式

    String regex = ".*\\*.*\\*.*";
    boolean valid = input.matches(regex);
    
  • 环路

    int asterisks = 0;
    for (int i = 0; i < input.length(); i ++) {
        if (input.charAt(i) == '*') {
            asterisks++;
        }
    }
    
    int星号=0;
    对于(int i=0;i

您可以使用
字符串。将
与正则表达式匹配:

"^.*(?:\\*.*){2}$"
如果您只需要两个星号:

"^[^*]*(?:\\*[^*]*){2}$"
不过,对于这个任务,只需迭代字符串并计算星号就可以了

int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;
boolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
  if ((i = str.indexOf("*", i+1)) != -1)
    return true;
return false;
}

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

这里有一个非正则表达式选项,可用于任何文本字符串:

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
为了完整性(虽然已经提供了几个很好的答案,但我最喜欢Mark和Joachim的答案),这里有两个基于和的版本:

(编辑,错误修复:)


我是根据我们的答案写的(我知道,基准并不重要,但它们很有趣,我知道我的可能很糟糕。)总之,下面是一个示例运行的结果:

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

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
*********************************************************************************
测试带有一个或更少星号的字符串
处理器:bhups
完成了。持续时间:40毫秒,错误:0
处理器:Bozho(循环版本)
完成了。持续时间:33毫秒,错误:0
处理人:Bozho(正则表达式版本)
完成了。持续时间:806毫秒,错误:0
处理人:约阿希姆·绍尔

完成了。持续时间:24毫秒,错误:0应该正好是两个,要修改它以检查正好是两个星号,只需将第三行更改为
return(index!=-1)&&
。你说得对,我是在阅读你的评论之前自己找到的。修复了它。您可以从正则表达式的前端和后端删除
*
,然后改用
find()
。这实际上可能要快一点。有人能解释一下这个正则表达式吗?第一个可以描述为:从任意数量的字符开始,然后向前看(两次)找到一个星号,后面跟着更多的字符。第二个可以描述为:从星号以外的任何东西开始,然后向前看(两次)找到星号,然后再找到其他任何东西。我认为它们有缺陷,因为它们向前看了两次,但没有任何东西阻止向前看两次找到同一个东西。我认为如果用{45}替换{2},它将继续匹配只有1或2的字符串。还要注意的是,有两个反斜杠不是正则表达式的一部分,但需要(即在java中)在正则表达式引擎中使用黑斜杠来转义星号。