Трудно найти правильное регулярное выражение - PullRequest
0 голосов
/ 29 января 2020

Я хочу найти любые три числа git и только два математических оператора, которые являются плюс и минус (+ или -).

Моя попытка:

" (? =. [0-9] {1,3}) (? =. [+ -]) "

Первая скобка говорит, что все числа между 0-9 , минимум 1 вхождение и максимум 3. В других скобках указано + и -.

Я использую это регулярное выражение в разбиении, но когда я ввожу строку

String str = "22 24 + "

-

str.split (" (? =. [0-9] {1,3}) (? =. [+ -]) ")

вывод

String [] outputArray = {22, 24 +}

Ожидаемый результат:

String [] outputArray = {22,24, +}

Это означает, что почему-то плюс не был распознан ..

Что я делаю не так здесь

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вы не сможете разделить, используя образец здесь. Вы должны соответствовать и группировать. Вот что вы просите:

final String str = "22 24 +";
final String pattern = "([0-9]{1,3}|[+-]{1})";

final List<String> allMatches = new ArrayList<>();
final Matcher m = Pattern.compile(pattern).matcher(str);
while (m.find())
{
    allMatches.add(m.group());
}
System.out.println(Arrays.toString(allMatches.toArray()));
1 голос
/ 29 января 2020

Если вы хотите split вашей исходной строки, то правильное регулярное выражение, например, " +(?=\\d{1,3}|[+-])", что означает:

  • Последовательность пробелов (я добавил "+" к разделить также в случае (несколько пробелов между токенами).
  • Позитивный прогноз - от 1 до 3 цифр или плюс или минус.

Другой возможный подход это найти все совпадения . Тогда регулярное выражение может быть, например, "\\d{1,3}|[-+]", что означает:

  • Альтернатива 1: последовательность из 1 до 3 цифр.
  • Альтернатива 2: плюс или минус.

Ниже приведен пример программы:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;

public class Simple{
  public static void main(String args[]){
    String str = "22  24  +";
    // Variant 1 - split
    String [] outArr = str.split(" +(?=\\d{1,3}|[+-])");
    System.out.println(Arrays.toString(outArr));
    // Variant 2 - find all matches
    List<String> allMatches = new ArrayList<String>();
    Matcher m = Pattern.compile("\\d{1,3}|[-+]").matcher(str);
    while (m.find()) {
      allMatches.add(m.group());
    }
    System.out.println(Arrays.toString(allMatches.toArray()));
  }
}

В обоих вариантах выведите [22, 24, +] - список результатов.

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