我们有一个字符串输入及以下组合是有效的(例如sunday
,*sunday*
,sun*day*
,*sun*day
,su*nda*y
) 如果只包含一个星号,那么这是一个错误的输入。如何检查一个字符串是否包含两个星号字符?
因此,鉴于上述输入,如何检查字符串是否包含多个星号。
我们有一个字符串输入及以下组合是有效的(例如sunday
,*sunday*
,sun*day*
,*sun*day
,su*nda*y
) 如果只包含一个星号,那么这是一个错误的输入。如何检查一个字符串是否包含两个星号字符?
因此,鉴于上述输入,如何检查字符串是否包含多个星号。
你可以使用String.matches
使用正则表达式:
"^.*(?:\\*.*){2}$"
如果你想正是两个星号:
"^[^*]*(?:\\*[^*]*){2}$"
虽然这项任务可能是简单的只是遍历字符串和计数星号。
任何人都可以请解释这个正则表达式吗? – ederollora 2014-03-11 18:43:55
至少有两种方式:
正则表达式
String regex = ".*\\*.*\\*.*";
boolean valid = input.matches(regex);
环
int asterisks = 0;
for (int i = 0; i < input.length(); i ++) {
if (input.charAt(i) == '*') {
asterisks++;
}
}
您可以从正则表达式的前面和末尾移除'。*',并使用'find()'来代替。这实际上可能会快一点。 – 2010-07-28 11:41:28
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
并修改它以检查*正好两个星号*,只需将第三行更改为'return(index!= -1)&&'。 – 2010-07-28 10:45:39
为了完整(虽然有几个很好的答案已经被提供,我喜欢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
似乎非正则表达式比正则表达式快很多。这就是你期望的,我猜。
编辑:修正了错误的赢家。对不起,约阿希姆
是33 <24? ;-) – 2010-07-28 10:47:25
你是对的,我在阅读你的评论前自己找到了。修复。 – 2010-07-28 10:56:20
至少有两个或两个? – 2010-07-28 07:45:01
它应该恰好是两个 – Achaius 2010-07-28 09:12:02