Матч до полной остановки - PullRequest
0 голосов
/ 25 октября 2018

Используя приведенное ниже регулярное выражение, я пытаюсь сопоставить две группы: первая - это весь текст, пока не будет достигнут полный стоп, вторая - число 0 или 1.

Вот регулярное выражение, которое я пытаюсь:"\\..+?(?=0|1)"

Код:

    final String regex = "\\..+?(?=0|1)";

    final String string = "this is a test 123. 1";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);

    if (matcher.find()) {
        System.out.println(matcher.group(0));
    }

отпечатки: .

Как вместо этого сопоставить this is a test 123. в group(0) и 1 в group(1)

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Всегда ли число будет 0 или 1 в конце?

Требуется ли регулярное выражение?

int fullStop = string.indexOf(".");
if (fullStop != -1) {
    System.out.println(string.substring(0, fullStop));
    System.out.println(string.substring(fullStop + 1).trim());
}

Выход:

это тест 123

1

0 голосов
/ 25 октября 2018

Попробуйте regex (.*?\.)(.*?[10]) и захватите группу 1 и 2

Regex

0 голосов
/ 25 октября 2018

Ваш Pattern не соответствует вашим требованиям.

Вот то, что ваши Pattern анализируют прямо сейчас:

| literal dot
|  | followed by any 1+ sequence reluctantly quantified
|  |  | followed by non-capturing 1 or 2
|  |  | 
\\..+?(?=0|1)

По определению, не захватывающие конструкции не могут иметь обратную ссылку (т.е. вы никогда не сможете получить их значения, вызвав Matcher#group).

А вот простой пример того, что вы хотите вместо этого:

String test = "this is a test 123. 1";
//                           | group 1: any 1+ char sequence reluctantly quantified, 
//                           |     | followed by a dot, non-capturing here
//                           |     |
//                           |     |     | any character reluctantly quantified
//                           |     |     | (here, your whitespace)
//                           |     |     |  | group 2: 1 or 2
Pattern p = Pattern.compile("(.+?)(?=\\.).*?([01])");
Matcher m = p.matcher(test);
if (m.find()) {
    System.out.printf("Group 1: %s%nGroup 2: %s%n", m.group(1), m.group(2));
}

Вывод

Group 1: this is a test 123
Group 2: 1

Примечания

  • Группа 0 всегда представляет весь матч.
  • Другими словами, определяемые пользователем нумерованные группы (определяемые содержимым, заключенным в скобки в шаблоне) начинаются с индекса 1.
  • См. Группы и захват раздел здесь .

  • Кажется, ваши требования для разбора окончательной цифры 0 / 1 немного слабоваты.Возможно, вы захотите спросить себя, будет ли эта цифра «изолированной», например, окружена линией, отличной от букв, или, возможно, частью большой последовательности цифр и т. Д. И т. Д.

0 голосов
/ 25 октября 2018

Вы можете использовать следующее регулярное выражение:

final String regex = ".*\\.(?=\\s*([01]))";
final String string = "this is a test 123. 1";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
    System.out.println(matcher.group(0));
    System.out.println(matcher.group(1));
} 

См. Демо Java .

Сведения о шаблоне

  • .*\. - (это будет значение группы 0) любые 0+ символов, кроме символов разрыва строки, до максимально возможного числа, вплоть до последнего . (включая его)
  • (?=\\s*([01])) - положительный прогноз, требующий 0+ пробелов и затем 1 или 0 (которые включены в Группу 1) непосредственно справа от текущего местоположения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...