Как проверить, содержит ли строка два символа звездочки? - PullRequest
9 голосов
/ 28 июля 2010

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

Итак, учитывая приведенные выше данные, как проверить, содержит ли строка несколько звездочек.

Ответы [ 6 ]

9 голосов
/ 28 июля 2010
int asterisk1 = input.indexOf('*');
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1;

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

4 голосов
/ 28 июля 2010

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

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

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

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

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

3 голосов
/ 28 июля 2010

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

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 голосов
/ 28 июля 2010

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

  • регулярное выражение

    String regex = ".*\\*.*\\*.*";
    boolean valid = input.matches(regex);
    
  • цикл

    int asterisks = 0;
    for (int i = 0; i < input.length(); i ++) {
        if (input.charAt(i) == '*') {
            asterisks++;
        }
    }
    
2 голосов
/ 28 июля 2010
boolean hasTwoAsteriks(String str) {
int i;
if((i = str.indexOf("*")) != -1) {
  if ((i = str.indexOf("*", i+1)) != -1)
    return true;
return false;
}
0 голосов
/ 28 июля 2010

Для полноты (хотя было дано несколько хороших ответов, мне нравятся лучшие от Марка и Иоахима), вот две версии на основе String.split (regex) и String.split (regex, предел)

(Редактировать, исправить ошибку:)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...