Регулярное выражение для извлечения предыдущих чисел с необязательными точками - PullRequest
0 голосов
/ 29 января 2019

Я ищу регулярное выражение.

Текстовый пример

1 Match
1.1 Match
45.67.21234.3 Match
1 Does not match1
12. Does not match

Извлеченные / совпадающие значения должны быть:

1
1.1
45.67.21234.31

Они не должны совпадать:

1 Does not match1 // no match because of an additional digit in the text
12. Does not match // no match because of the dot after 12

Пока мое регулярное выражение выглядит так:

(\d+\.)+\d

Но это не соответствует самой первой записи.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Использование (\d+\.)+\d не будет соответствовать первой записи, потому что при использовании квантификатора + оно должно соответствовать как минимум 1 раз цифре и точке.

Что вы можете сделать, это использовать якорь ^ для подтверждения начала строки и использования шаблона для сопоставления цифр с последующим повторением сопоставления точки и цифр ноль или более раз, чтобы вы также соответствовали первой записи.

После сопоставления убедитесь, что цифрыне сопровождаются непробельным символом.Если после вас не может быть больше цифр, вы можете использовать дополнительный отрицательный прогноз.

^\d+(?:\.\d+)*(?!\S)(?!.*\d)

В Java:

String regex = "^\\d+(?:\\.\\d+)*(?!\\S)(?!.*\\d)";

Regex demo

Пояснение

  • ^ Начало строки
  • \d+(?:\.\d+)* Совпадение 1+ цифр с повторяющимся шаблоном, чтобы соответствовать точке и1+ цифры
  • (?!\S) отрицательный знак предпросмотра для проверки того, что слева, не является непробельным символом
  • (?!.*\d) отрицательный знак предпросмотра для проверки того, что справа не содержитцифра
0 голосов
/ 29 января 2019

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

^((\d+\.)*\d+) \D*$

Где группа захвата 1 будет содержать ваш матч.

Объяснение:

^              # Start of the String
 (             # Open capture group 1:
  (\d+\.)      #  One or more digits, followed by a dot
         *     #  Repeated 0 or more times
          \d+  #  Followed by 1 or more digits
 )             # Closing capture group 1
               # Followed by a space
   \D*         # Followed by 0 or more non-digits
$              # Followed by the end of the String

^ и $ заставят нас взглянуть на всю строку.\D* убедится, что в подстроке нет пробелов после пробела.И \d+ после (\d+\.)* гарантирует, что всегда есть начальная цифра, с одной или несколькими #. перед ней (где # - неотрицательное число).

Чтобы извлечь этозначение, вы можете использовать это регулярное выражение с String.matches и .replaceFirst следующим образом:

// TODO: Give proper method name
String test(String str){
  String regex = "^((\\d+\\.)*\\d+) \\D*$";
  if(str.matches(regex))
    return str.replaceFirst(regex, "$1");
    // The `$1` will leave just the match of the first capture group,
    // removing everything else we don't need
  else
    return null;
}

Попробуйте онлайн.

Если одно число без пробелов позади него (например, "123") также должно совпадать, можно сделать небольшие изменения в регулярном выражении, изменив \\D*$ на ( \\D*)?$, чтобы пробел стал необязательным.

Попробуйте онлайн.

0 голосов
/ 29 января 2019

Мы можем попробовать использовать следующий шаблон регулярных выражений для каждой строки:

^(?!\D*\d[^0-9.]+\d).*\b\d+(?:\.\d+)?(?=\\s|$).*$

Объяснение:

^                            from the start of the line
    (?!\D*\d[^0-9.]+\d)      assert that two (or more) separate numbers
                             do not occur in the line
    .*                       then consume anything, up to
    \b\d+(?:\.\d+)?          an integer, or complete decimal
    (?=\\s|$)                where either a space or the end of the line follows
    .*                       then consume anything, up to
$                            the end of the line

Вот код Java, использующий этот шаблон:

String line = "45.67.21234.3";
String pattern = "^(?!\\D*\\d[^0-9.]+\\d).*\\b\\d+(?:\\.\\d+)?(?=\\s|$).*$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println("match");
}
else {
    System.out.println("no match");
}

Я проверил его на всех ваших входах, и, похоже, он работает.

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