Использование регулярного выражения для проверки входных данных, разделенных двоеточиями - PullRequest
0 голосов
/ 27 сентября 2018

Чтение в файле для Java-приложения, в котором данные разделены двоеточиями в формате:

test : test : 0 : 0

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

test : test : 0 : 0 ---->pass
: test: 0 : 0 -----> fail
0 : test : 0 : test -----> fail
test test : 0 : 0 -----> fail

Таким образом, совпадение не будет выполнено, если пропущены какие-либо сегменты, если цифры и слова не появятся там, где они должныто есть слово: слово: цифра: цифра, и должно быть 3 двоеточия и 4 сегмента, не больше, не меньше, как указано выше.

Это то, чего я добился до сих пор, но это не совсем правильно:

^\D+(?:\s\:\s\w+)*$

Спасибо заранее за любую помощь!

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

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

^[a-zA-Z]+\s*:\s*[a-zA-Z]+(?:\s*:\s*\d+){2}$

Детали

  • ^ - начало строки (неявно в String#matches)
  • [a-zA-Z]+ - 1+ букв ASCII
  • \s*:\s* - :, заключенный в 0+ пробелов
  • [a-zA-Z]+ - 1+ букв ASCII
  • (?:\s*:\s*\d+){2} - два вхождения :, заключенные в 0+ пробелов и затем 1+ цифр
  • $ - конец строки (неявно в String#matches)

ПРИМЕЧАНИЕ : Если между элементами должен быть обязательный пробел, необходимо заменить \s* на \s.Чтобы соответствовать 1 или нескольким пробелам, \s* должен быть превращен в \s+.

В Java вы можете написать его как

s.matches("[a-zA-Z]+\\s*:\\s*[a-zA-Z]+(?:\\s*:\\s*\\d+){2}")

См. Демонстрационную версию regex

0 голосов
/ 27 сентября 2018

Вот, пожалуйста (демо на Regex101 ):

[a-zA-Z]+\s+:\s+[a-zA-Z]+\s+:\s+\d+\s+:\s+\d+

Объяснение:

  • [a-zA-Z]+ означает 1 или более букв (+ - это модификаторы, позволяющие соответствовать предыдущему выражению хотя бы один раз
  • \s+ означает 1 или более
  • : - это : символ, буквально
  • \d+ обозначает хотя бы одну цифру (удалите +, чтобы точно соответствовать одной цифре)

Наконец, составьте эти части в соответствии с вашими потребностями. Возможно, вы захотите заставить Regex сделать более строгую замену\s+ только с одним пустым пробелом .

Проверьте строку, используя метод String::matches (не забудьте использовать две косые черты \\):

boolean isValid = string.matches("[a-zA-Z]+\\s+:\\s+[a-zA-Z]+\\s+:\\s+\\d+\\s+:\\s+\\d+");
0 голосов
/ 27 сентября 2018

Я бы просто использовал String#matches в каждой строке со следующим шаблоном:

[a-z]+ : [a-z]+ : [0-9]+ : [0-9]+

Например:

String line = "test : test : 0 : 0";
if (line.matches("[a-z]+ : [a-z]+ : [0-9]+ : [0-9]+")) {
    System.out.println("Found a match");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...