выражение регулярного выражения - указание количества повторяющихся символьных значений в строке - PullRequest
1 голос
/ 25 августа 2010

как я могу проверить наличие шаблона определенное количество раз?

например:

4444444 => return 4

4444332 => return 4

4444431 => return 4

4443333 => return 0

4243424 => return ?

но если символ 4 встречается менее 4 раз, возвращается 0

Я просто ищу 4 здесь. если оно больше или равно 4 разам, возвращаемое значение будет равно 4. Остальные 3 числа в строке могут находиться в диапазоне от 1 до 3.

спасибо.

Ответы [ 5 ]

2 голосов
/ 25 августа 2010

Похоже, ^[1-3]*4[1-3]*4[1-3]*4[1-3]*4[1-4]*$ - это то, что вам нужно.

Совпадение '4' 4 раза, окруженное числами от 1-3. Последний случай в основном говорит, что после 4 совпадений 4 раза, могут быть любые числа 1-4 до конца строки. Это работает для шаблонов, которые вы предложили выше. Проблема с вышеприведенным выражением заключается в том, что если произошел сбой, и ваша строка длинная (> 100 символов), то вы можете иметь то, что известно как Катастрофический возврат (см. Комментарии ниже ...) Чтобы избежать этого, вам понадобятся притяжательные соответствия или более поддерживаемые независимые подвыражения . Это будет выглядеть так (обратите внимание, вы также можете сделать это с притяжательными совпадениями *+ и т. Д.):

^(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-4]*)$
2 голосов
/ 25 августа 2010

Если вам нужно четыре последовательных четверки, это просто 4{4} или 4444. Если они не должны быть последовательными, 4.*4.*4.*4 сделает это. Если это может быть любое число, но оно должно быть четыре раза, то ([1-4])\1{3} или ([1-4]).*\1.*\1.*\1 в зависимости от того, нужно ли вам, чтобы они были последовательными или нет.

2 голосов
/ 25 августа 2010

Чтобы проверить наличие 4 последовательных одинаковых цифр от 1 до 4, вы можете использовать регулярное выражение:

([1-4])\1{3}
0 голосов
/ 25 августа 2010

Вы можете использовать шаблон "(4[^4]*){4}"

  List<String> inputs = Arrays.asList("4444444", "4444332", "4443333", 
      "4243424", "4444431");
  Pattern pattern = Pattern.compile("(4[^4]*){4}");
  for(String input: inputs) {
    Matcher matcher = pattern.matcher(input);
    System.out.printf("Min 4 fours in '%s'? %b\n", input, matcher.find());
  }

Выход:

Min 4 fours in '4444444'? true
Min 4 fours in '4444332'? true
Min 4 fours in '4443333'? false
Min 4 fours in '4243424'? true
Min 4 fours in '4444431'? true
0 голосов
/ 25 августа 2010

Затем для подсчета шаблонов:

public static void main(String[] args)
{
    String input = "44444123444441234444";
    Pattern pattern = Pattern.compile("4444");
    Matcher matcher = pattern.matcher(input);
    int count = 0;
    int lookupPosition = 0;

    while (matcher.find(lookupPosition))
    {
        count++;
        lookupPosition = matcher.start() + 1;
    }

    System.out.println(count);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...