захват группы последовательных цифр с помощью регулярных выражений - PullRequest
4 голосов
/ 12 апреля 2019

Я пытаюсь захватить только две шестерки, смежные друг с другом, и узнать, сколько раз это происходило, используя регулярное выражение, как если бы у нас было 794234879669786694326666976, ответ должен быть 2 или, если его 66666, он должен быть равен нулю и т. Д. Я использую следующий код и захватил его этим (66)* и использую matcher.groupcount(), чтобы узнать, сколько раз это происходило, но оно не работает !!!

package me;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class blah {

    public static void main(String[] args) {

       // Define regex to find the word 'quick' or 'lazy' or 'dog'
    String regex = "(66)*";
    String text = "6678793346666786784966";

    // Obtain the required matcher
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    int match=0;

    int groupCount = matcher.groupCount();
    System.out.println("Number of group = " + groupCount);

    // Find every match and print it
    while (matcher.find()) {

        match++;
    }
    System.out.println("count is "+match);
}

}

Ответы [ 3 ]

4 голосов
/ 12 апреля 2019

Один из подходов здесь состоит в том, чтобы использовать обходные пути, чтобы обеспечить соответствие только островков ровно двух шестерок:

String regex = "(?<!6)66(?!6)";
String text = "6678793346666786784966";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);

Это находит счетчик два для введенной вами входной строки (два совпадения: 66 в самом начале и конце строки).

Шаблон регулярного выражения использует два обходных пути, чтобы утверждать, что то, что предшествует первым 6 и вторым 6, не другие шестерки:

(?<!6)   assert that what precedes is NOT 6
66       match and consume two 6's
(?!6)    assert that what follows is NOT 6
0 голосов
/ 13 апреля 2019

Это не займет много времени, чтобы придумать. Мне нравятся регулярные выражения, но я не использую их, если это действительно необходимо. Вот один метод цикла, который, кажется, работает.

  char TARGET = '6';
  int GROUPSIZE = 2;
  // String with random termination character that's not a TARGET
  String s = "6678793346666786784966" + "z";

  int consecutiveCount = 0;
  int groupCount = 0;
  for (char c : s.toCharArray()) {
     if (c == TARGET) {
        consecutiveCount++;
     }
     else {
        // if current character is not a TARGET, update group count if
        // consecutive count equals GROUPSIZE
        if (consecutiveCount == GROUPSIZE) {
           groupCount++;
        }
        // in any event, reset consecutive count
        consecutiveCount = 0;
     }
  }

  System.out.println(groupCount);
0 голосов
/ 12 апреля 2019

Вам необходимо использовать

String regex = "(?<!6)66(?!6)";

См. Демоверсию regex .

enter image description here

Подробности

  • (?<!6) - нет 6 прямо перед текущим местоположением
  • 66 - 66 подстрока
  • (?!6)- нет 6 сразу после текущего местоположения.

См. Java демо :

String regex = "(?<!6)66(?!6)";
String text = "6678793346666786784966";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
int match=0;
while (matcher.find()) {
    match++;
}
System.out.println("count is "+match); // => count is 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...