Как бороться с регулярными выражениями Java? - PullRequest
2 голосов
/ 11 июля 2019

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

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

 DYYU-tx-6.7.9.7_6.1.1.0 
 DYYU-tx-6.7.9.7_60.11.11.09 
 DYYU-tx-60.70.90.70_6.1.1.0 

Я чувствую, что это очень просто сделать .. Так что извините, если это глупый вопрос длякто-то :(

Я пробовал этот шаблон, но он не работал: ^.*_.*-.*-([0-9]*)\\..*\\..* $

Любая помощь, пожалуйста. Я буду более чем благодарен.

Ответы [ 4 ]

6 голосов
/ 11 июля 2019

В примерах много образцов, например, мы можем начать с этого выражения:

^[^-]+-[^-]+-[^_]+_([0-9]+\.){3}[0-9]+$

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

Test

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

final String regex = "^[^-]+-[^-]+-[^_]+_([0-9]+\\.){3}[0-9]+$";
final String string = "DYYU-tx-6.7.9.7_6.1.1.0\n"
     + "DYYU-tx-6.7.9.7_60.11.11.09\n"
     + "DYYU-tx-60.70.90.70_6.1.1.0";

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

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

3 голосов
/ 11 июля 2019

Ваш шаблон не соответствует, потому что вы используете .*, который сначала будет соответствовать до конца строки. Затем вы сопоставляете _, чтобы он возвращался к последнему подчеркиванию, и пытаетесь сопоставить остальную часть шаблона.

Поскольку есть 1 подчеркивание, вы хотите сопоставить дефис, следующий за ним, но после подчеркивания нет дефиса, поэтому совпадения нет.

Другой способ написать это может быть использование класса символов с отрицанием [^-], не соответствующего дефису, вместо использования .*

^[^-]+-[^-]+-\d+(?:\.\d+){3}_\d+(?:\.\d+){3} $

Объяснение

  • ^ Начало строки
  • [^-]+- Совпадение 1+ раз с любым символом, кроме -
  • [^-]+- То же, что и выше
  • \d+(?:\.\d+){3} Математика 1+ цифр, повторите 3 раза, сопоставляя . и 1+ цифр
  • _ Соответствие подчеркиванию
  • \d+(?:\.\d+){3} Математика 1+ цифр, повторите 3 раза, совпадая с . и 1+ цифрами
  • [ ]$ Соответствует пробелу (обозначается между скобками для ясности) и подтверждает конец строки

В Java

String regex = "^[^-]+-[^-]+-\\d+(?:\\.\\d+){3}_\\d+(?:\\.\\d+){3} $";

Regex demo

Обратите внимание, что в данных вашего примера строки заканчиваются пробелом, поэтому перед $

есть пробел
3 голосов
/ 11 июля 2019

Попробуйте это:

^\w+-\w+-(\d+)(\.\d+)+_(\d+\.)+\d+

Демонстрация

В Java наиболее вероятно что-то вроде этого:

"^\\w+-\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\d+"

Объяснение:

  • ^\w+-\w+- первые две части, например DYYU-tx-
  • (\d+)(\.\d+)+_ числа, разделенные ., заканчивающиеся _, например 6.7.9.7_
  • (\d+\.)+\d+ числа разделены ., например 60.11.11.09
2 голосов
/ 11 июля 2019
DYYU-tx-(?>\d+[._]?){8}
  1. Поиск литерала DYYU-tx-
  2. Найдите 1 или более цифр, за которыми может следовать . или _ 8 раз.

Я предполагал, что он всегда будет начинаться с DYYU-tx- и что это всегда будет 4 числа, разделенных точками, за которыми следует подчеркивание, которое затем будет иметь еще 4 числа, разделенных точками.

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