#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:
Две проблемы:
- В java (в отличие от perl и т. Д.) Регулярные выражения не заключаются в
/
символы - Вы должны экранировать свои
{
литералы:
Попробуйте это:
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})\}$"