Я прошу прощения за ужасный заголовок ... может быть трудно попытаться обобщить всю ситуацию в одном предложении.
Позвольте мне начать с того, что я спрашиваю, потому что я просто не эксперт по Regex. Я использовал это немного здесь и там, но я просто не могу найти правильный способ удовлетворить следующие требования.
Регулярное выражение, которое я пытаюсь написать, предназначено для использования в схеме XML для проверки ввода и используется в другом месте в Javascript для той же цели.
Существует два различных поддерживаемых формата. Существует литеральная строка, которая должна быть заключена в кавычки, и строка шестнадцатеричного значения, которая должна быть заключена в фигурные скобки.
Некоторые тестовые случаи:
"this is a literal string"
<- допустимая строка, правильно заключенная в "s <br>
"this should " still be correct"
<- Допустимая строка, "разрешены в пределах (если возможно, это требование может быть отменено при необходимости) <br>
"{00 11 22}"
<- Допустимая строка, {} разрешено в строках. Еще один, который можно простить при необходимости <br>
I am bad output
<- неверная строка, нет <code>" с
"Some more problemss"you know
<- Неверная строка, должна быть полностью указана в <code>" s
{0A 68 4F 89 AC D2}
<- допустимая строка, шестнадцатеричные символы, заключенные в <code>{} с
{DDFF1234}
<- Допустимая строка, пробелы игнорируются для шестнадцатеричных строк <br>
DEADBEEF
<- Неверная строка, должна содержаться либо в <code>" с, либо в {}
с
{0A 12 ZZ}
<- Неверная строка, 'Z' не является допустимым шестнадцатеричным символом </p>
Чтобы удовлетворить эти общие требования, я придумал следующее регулярное выражение, которое , кажется, работает достаточно хорошо. Я все еще довольно новичок в Regex, поэтому здесь может быть огромная дыра, которую я пропускаю.
".+"|\{([0-9]|[a-f]|[A-F]| )+\}
Если я правильно помню, регулярное выражение схемы XML автоматически предполагает начало и конец строки (^
и $
соответственно). Таким образом, по сути, это регулярное выражение принимает любую строку, которая начинается и заканчивается "
или начинается и заканчивается {}
s и содержит только допустимые шестнадцатеричные символы. До сих пор это работало хорошо для меня, за исключением того, что я забыл о другой (хотя и менее распространенной и, следовательно, забытой) опции ввода, которая полностью нарушает мое регулярное выражение.
Где я допустил ошибку:
Допустимый ввод также должен позволять пользователю разделять допустимые строки (любого типа, литерал / шестнадцатеричный) запятой. Это означает, что одна строка должна содержать более одной из указанных выше допустимых строк, разделенных запятыми. К счастью, однако, запятая не поддерживаемый символ в литеральной строке (хотя я вижу, что мое существующее регулярное выражение не заботится о запятых).
Пример тестовых случаев:
"some string",{0A F1}
<- Действительный <br>
{1122},{face},"peanut butter"
<- Действительный <br>
{0D 0A FF FE},"string",{FF FFAC19 85}
<- Действительный (пробелы не имеют значения в шестнадцатеричных значениях) <br>
"Validation is allowed to break, if a comma is found not separating values",{0d 0a}
<- Неверно, запятая является разделителем, но «Проверка может быть прервана» и «если запятая ...» не помечены как отдельные строки с <code>" s
hi mom,"hello"
<- Неверно, String1 не был правильно заключен в <code>" s или {}
s
Я думаю, что можно использовать запятые в качестве разделителя для проверки каждого «раздела» строки на соответствие регулярному выражению, аналогичному оригиналу, но я просто не настолько продвинут в регулярном выражении, чтобы найти решение самостоятельно. Любая помощь будет принята с благодарностью, но в конечном итоге окончательное решение с объяснением будет просто звездным.
Спасибо за чтение этой огромной стены текста!