Сопоставление содержимого строки с рисунком - PullRequest
0 голосов
/ 17 декабря 2010

Я изо всех сил пытаюсь создать шаблон соответствия регулярному выражению для использования с методом match () объекта String. Моя строковая величина что-то вроде -

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml

Я использую метод String.matches ("regex"), но, честно говоря, изо всех сил стараюсь создать шаблон, который будет соответствовать значениям String, как эти. Я попробовал несколько разных комбинаций, но тщетно. Искал в интернете несколько примеров. Значения всегда будут в одинаковом формате, хотя длина может варьироваться.

Любая помощь очень ценится.


Есть еще что-то для соответствия .xml
Ну, кроме приведенного примера, в списке будут и другие значения, поэтому мне нужно сопоставить как

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml  

Список значений может быть как -

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml
3012145_Error.xml
3012145_UK.pdf
3012145A_20348409.ABC.10.10.10.xml

Мне нужно первое значение среди этих

(alphanum)(underscore)(num)(hyphen)(num)(dot)(aLpHa)(dot)(num)(dot)(num)(dot)(.xml)  

Я пробовал это -

s.matches("[a-zA-Z0-9]_[0-9]-[0-9].[a-zA-Z].[0-9].[0-9].xml");

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Требование:

(alphanum)(underscore)(num)(hyphen)(num)(dot)(aLpHa)(dot)(num)(dot)(num)(dot)(.xml)

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

\w*_\d*-\d*\.([a-zA-Z])*\.\d*\.\d*(\.)?\.xml

В Java это будет означать:

Pattern p = Pattern.compile("\\w*_\\d*-\\d*\\.([a-zA-Z])*\\.\\d*\\.\\d*(\\.)?\\.xml",Pattern.CASE_INSENSITIVE);

Примечание

Поскольку я использую [a-zA-Z], вам может не понадобиться Pattern.CASE_INSENSITIVE

Проблема с вашим регулярным выражением: s.matches("[a-zA-Z0-9]_[0-9]-[0-9].[a-zA-Z].[0-9].[0-9].xml");

Вы ищете один экземпляр alpha, number или alphanumeric. Используйте * или + метасимволы.

Надеюсь, это поможет.

0 голосов
/ 17 декабря 2010

Brilliant !. Большое спасибо, Фавониус.
Это сработало отлично.
Итак, насколько я понимаю, что я делал, хотя я давал диапазон [0-9a-zA-Z], на самом деле он пытался сопоставить только первый символ, в моем примере 3.
Так что в действительности вместо 3012145A он проверял только, является ли 3 частью моего заданного диапазона ([0-9a-zA-Z]) и т. Д. Для всей строки.
Ваше решение \w* проверит, является ли данный конкретный раздел буквенно-цифровым, или \d* проверит, находится ли раздел (ограниченный границами, скажем, . или _) во всем диапазоне чисел и / или алфавитов.

Так что очень мутный способ сопоставления 3012145A_ может быть

[0-9][0-9][0-9][0-9][0-9][0-9][0-9][a-zA-Z]_

Я не предлагаю это решение, просто пытаюсь понять поведение и разницу между [0-9] и \d*.

У меня все еще есть вопрос, значение (\\.)?\\., какова цель этого.

Большое спасибо еще раз

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