我们有一个字符串输入,以下组合是有效的(例如
因此,给定上述输入,如何检查字符串是否包含多个星号。
sunday
,*sunday*
,sun*day*
,*sun*day
,su*nda*y
)。如果仅包含一个星号,则为坏输入。因此,给定上述输入,如何检查字符串是否包含多个星号。
int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;
编辑:该解决方案假定要求是“至少有两个星号”。
String.matches
:"^.*(?:\\*.*){2}$"
如果你想要恰好两个星号:
"^[^*]*(?:\\*[^*]*){2}$"
regex
String regex = ".*\\*.*\\*.*";
boolean valid = input.matches(regex);
loop
int asterisks = 0;
for (int i = 0; i < input.length(); i ++) {
if (input.charAt(i) == '*') {
asterisks++;
}
}
.*
并使用 find()
。这可能会更快一些。 - Joachim Sauerpublic 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
return (index!= -1) &&
。 - Joachim Sauerboolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
if ((i = str.indexOf("*", i+1)) != -1)
return true;
return false;
}
为了完整性(尽管已经提供了几个很好的答案,我最喜欢Mark和Joachim的答案),这里有两个基于String.split(regex)和String.split(regex, limit)的版本:
(编辑,修复错误:)
boolean containsAtLeastTwoAsterisks = ("_" + myString + "_").split("\\*", 3).length == 3;
boolean containsExactlyTwoAsterisks = ("_" + myString + "_").split("\\*").length == 3;
我根据我们的答案写了一个小小的基准测试(我知道,基准测试并不意味着太多,但它们很有趣,而且我的可能很糟糕,我知道)。无论如何,这是一个样本运行的结果:
*********************************************************************************
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
似乎非正则表达式比正则表达式快很多。我想这是你所期望的。
编辑:修正错误的获胜者。抱歉,Joachim。