Ошибка регулярного выражения Java

#java #regex

#java #регулярное выражение

Вопрос:

Я не могу запустить это регулярное выражение на Java:

  String regex = "/^{m:"(.*)",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})}$/";

String data = "{m:"texttexttext",s:1231,r:23123,t:1}";
Pattern p = Pattern.compile(regex_Write_clientToServer);

Matcher a = p.matcher(data);
 

Это то же самое регулярное выражение и те же данные в тестере сайта регулярных выражений (как http://gskinner.com/RegExr / ) работает нормально!

Ответ №1:

Две проблемы:

  1. В java (в отличие от perl и т. Д.) Регулярные выражения не заключаются в / символы
  2. Вы должны экранировать свои { литералы:

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

 String regex = "^\{m:"(.*)",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\}$";
 

Ответ №2:

Есть две проблемы:

  • Косые черты не являются частью самого шаблона и не должны включаться.
  • Вам нужно избегать фигурных скобок в начале и в конце, так как в противном случае они будут рассматриваться как кванторы повторения. Это может быть не так в других реализациях регулярных выражений, но это, безусловно, имеет место в Java — когда я попытался просто удалить косые черты, я получил исключение Pattern.compile .

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

 String regex="^\{m:"(.*)",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\}$";
 

(Это работает с вашими образцами данных.)

Кроме того, если это предназначено для синтаксического анализа JSON, я бы лично не пытался делать это с помощью регулярных выражений — вместо этого используйте настоящий анализатор JSON. В долгосрочной перспективе это будет намного более гибким.

Комментарии:

1. На самом деле, вам не нужно экранировать фигурные скобки, если они не могут быть неверно истолкованы как часть {m,n} квантора. Вероятно, лучше всего сделать это в любом случае, чтобы избежать путаницы.

2. @TimPietzcker: Да, вы это делаете — в противном случае вы получите исключение Pattern.compile . Я знаю это только потому, что я попробовал это без предварительного экранирования и получил «Незаконное повторение около индекса 0» в виде исключения 🙂

3. О, интересно. Тогда это специальность Java. Другие варианты регулярных выражений просто рассматривают его как литерал.

Ответ №3:

Две вещи: Java не требует, чтобы у вас был какой-либо начальный / конечный символ. таким образом, вы можете удалить / chars

Кроме того, Java требует, чтобы вы избегали любых метасимволов регулярных выражений, если вы хотите сопоставить их. В вашем случае символам фигурных скобок ‘{‘ и ‘}’ должна предшествовать двойная обратная косая черта (одна для java escape, одна для регулярного выражения escape).:

 "^\{m:"(.*)",s:([0-9]{1,15}),r:([0-9]{1,15}),t:([0-9]{1,2})\}$"