Как проверить порядок появления строк, используя шаблоны регулярных выражений Java? - PullRequest
0 голосов
/ 17 сентября 2011

Я написал следующий код для сопоставления с шаблоном, и он хорошо работает, возвращая true для совпавшего

   Pattern pattern=Pattern.compile("(:(TRANSID,[0-9]*))?(:(PAYTYPE,[0-9&&[01]]{1}))?");
   Matcher matcher=pattern.matcher(":TRANSID,0:PAYTYPE,0");
   System.out.println(matcher.matches());

   Output=true

но приведенный ниже код возвращает значение false, когда PAYTYPE и TRANSID обмениваются там позициями. Пожалуйста, помогите

   Pattern pattern=Pattern.compile("(:(TRANSID,[0-9]*))?(:(PAYTYPE,[0-9&&[01]]{1}))?");
   Matcher matcher=pattern.matcher(":PAYTYPE,0:TRANSID,0");
   System.out.println(matcher.matches());

   Output=false

Пожалуйста, дайте мне знать, что изменение должно быть сделано в шаблоне, чтобы он возвращал истину, даже если порядок изменяется, но параметры должны быть одинаковыми.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2011

Если у вас есть 14 различных шаблонов суб-паттернов, которые могут встречаться в любом порядке, но должны встречаться определенное количество раз (для каждого суб-паттерна), это выходит за рамки того, что вы можете разумно делать с регулярными выражениями ... или дажес контекстно-свободной грамматикой.

Мой совет - разработать Regex, который соответствует произвольной последовательности любого из подшаблонов, а затем сопоставить / сосчитать их, используя Map.

0 голосов
/ 17 сентября 2011
[(:(TRANSID,[0-9]*)) | (:(PAYTYPE,[0-9&&[01]]{1}))]*

Как-то так.Используйте оператор ИЛИ.Если вам нужно обеспечить ровно два совпадения в любом порядке, попробуйте ...

[(:(TRANSID,[0-9]*)) | (:(PAYTYPE,[0-9&&[01]]{1}))] [(:(TRANSID,[0-9]*)) | (:(PAYTYPE,[0-9&&[01]]{1}))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...