Нам вводили строку, и следующие комбинации допустимы (например. sunday
, *sunday*
, sun*day*
, *sun*day
, su*nda*y
) Если это содержит только единственную звездочку, то это - плохой вход.
Так данный вышеупомянутый вход, как я проверяю, чтобы видеть, содержит ли строка несколько звездочек.
Вы можете использовать String.matches
с регулярным выражением:
"^.*(?:\\*.*){2}$"
Если вы хотите ровно , две звездочки:
"^[^*]*(?:\\*[^*]*){2}$"
Хотя для этой задачи может быть проще просто выполнить итерацию над строкой и посчитайте звездочки.
int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;
Редактировать: это решение предполагало, что требовалось «иметь как минимум две звездочки».
Вот альтернатива без регулярного выражения, которая работает с любой литеральной строкой:
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
Для полноты (хотя было предоставлено несколько хороших ответов, мне больше всего нравятся ответы Марка и Иоахима), вот две версии, основанные на String.split (regex) и ] String.split (regex, limit) :
(Edit, error fix:)
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
Похоже, что нерегулярное выражение намного быстрее, чем регулярное выражение. Думаю, этого вы и ожидали.
РЕДАКТИРОВАТЬ: исправлен неправильный победитель. извините, Иоахим
Как минимум двумя способами:
regex
String regex = ". * \\ *. * \\ *. *";
логическое допустимое = input.matches (регулярное выражение);
цикл
int звездочки = 0;
for (int i = 0; i
boolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
if ((i = str.indexOf("*", i+1)) != -1)
return true;
return false;
}