Как проверить, содержит ли строка два символа звездочки?

Нам вводили строку, и следующие комбинации допустимы (например. sunday, *sunday*, sun*day*, *sun*day, su*nda*y) Если это содержит только единственную звездочку, то это - плохой вход.

Так данный вышеупомянутый вход, как я проверяю, чтобы видеть, содержит ли строка несколько звездочек.

9
задан Joachim Sauer 28 July 2010 в 07:44
поделиться

6 ответов

Вы можете использовать String.matches с регулярным выражением:

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

Если вы хотите ровно , две звездочки:

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

Хотя для этой задачи может быть проще просто выполнить итерацию над строкой и посчитайте звездочки.

4
ответ дан 4 December 2019 в 10:03
поделиться
int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;

Редактировать: это решение предполагало, что требовалось «иметь как минимум две звездочки».

9
ответ дан 4 December 2019 в 10:03
поделиться

Вот альтернатива без регулярного выражения, которая работает с любой литеральной строкой:

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
3
ответ дан 4 December 2019 в 10:03
поделиться

Для полноты (хотя было предоставлено несколько хороших ответов, мне больше всего нравятся ответы Марка и Иоахима), вот две версии, основанные на 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

Похоже, что нерегулярное выражение намного быстрее, чем регулярное выражение. Думаю, этого вы и ожидали.

РЕДАКТИРОВАТЬ: исправлен неправильный победитель. извините, Иоахим

0
ответ дан 4 December 2019 в 10:03
поделиться

Как минимум двумя способами:

  • regex

     String regex = ". * \\ *. * \\ *. *";
    логическое допустимое = input.matches (регулярное выражение);
    
  • цикл

     int звездочки = 0;
    for (int i = 0; i 
3
ответ дан 4 December 2019 в 10:03
поделиться
boolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
  if ((i = str.indexOf("*", i+1)) != -1)
    return true;
return false;
}
2
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: