Декодировать выражение Regex - ^[a-zA-Z0-9 "& amp;!#$%()*+,-./:;?@[\\]^_`{|}~]+$

Использование Java

Я не являюсь постоянным пользователем регулярных выражений, я столкнулся со следующим регулярным выражением как часть перехода от Spring-модулей-валидации к последнему.

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$

Что именно это делает? Мне нужно понять это, чтобы написать модульный тест для этой проверки. Кстати, я использую его в проекте Java.

Еще одна интересная вещь, я попробовал это выражение в hibernate-validator следующее:

@Pattern(regexp = "^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$")

Затем мой intellijIDEA показывает ошибку в конце строки, говорящую о незакрытом символьном классе. это выражение регулярного выражения сформировано правильно?

Обновить

Кажется, что выражение искажено, я вижу следующее исключение при попытке проверить это:

java.util.regex.PatternSyntaxException: Unclosed character class near index 57
^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\]^_`{|}~]+$

Вот оригинальное выражение из одного из XML-файлов, которые я пытаюсь перенести:

<regexp apply-if="creativeType == 'Text'" expression="^[a-zA-Z0-9 

&quot;&apos;&amp;!#$%()*+,-./:;?@[\\]^_`{|}~]+$"/>

Я что-то пропустил?

Рабочий раствор

regexp = "^[a-zA-Z0-9 \"'&!#$%()*+,-./:;?@\\[\\]^_`{|}~]+$"

таким образом, я назначил его на строку, и это прекрасно работает для меня Спасибо всем!

2 ответа

Решение

Переведенное выражение будет выглядеть примерно так

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@\[\]^_`{|}~]+$

и означает строку букв, цифр и набор других символов (например, различные скобки, где] должен быть экранирован, чтобы не означать конец класса символов).

Вы можете использовать что-то вроде YAPE::Regex::Explain в Perl или RegexBuddy, чтобы получить подробное описание вашего регулярного выражения. Грязный однострочник можно найти ниже:

perl -MYAPE::Regex::Explain -e \
'$e=<>; print YAPE::Regex::Explain->new($e)->explain';

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

The regular expression:

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\]^_`{|}~]+$

matches as follows:

NODE                       EXPLANATION
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ^                        the beginning of the string
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  [a-zA-Z0-9               any character of: 'a' to 'z', 'A' to 'Z',
  "'&!#$%()*+,-             '0' to '9', ' ', '"', ''', '&', '!', '#',
  ./:;?@[\]^_`{|}~]+       '$', '%', '(', ')', '*', '+', ',' to '.',
                           '/', ':', ';', '?', '@', '[', '\]', '^',
                           '_', '`', '{', '|', '}', '~' (1 or more
                           times (matching the most amount possible))
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  $                        before an optional \n, and the end of the
                           string
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Использование чего-то вроде Regex Buddy позволит вам выбрать разновидность Java для вашего регулярного выражения, но в этом случае оно должно быть довольно стандартным.

Вы уверены, что это Java, хотя? Из всего этого побега это выглядит как часть XSD / XPath / XML.

Другие вопросы по тегам