Помощь с определенным регулярным выражением: необходимо сопоставить несколько экземпляров нескольких форматов в одной строке - PullRequest
0 голосов
/ 14 мая 2010

Я прошу прощения за ужасный заголовок ... может быть трудно попытаться обобщить всю ситуацию в одном предложении.

Позвольте мне начать с того, что я спрашиваю, потому что я просто не эксперт по 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, поэтому здесь может быть огромная дыра, которую я пропускаю.

&quot;.+&quot;|\{([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

Я думаю, что можно использовать запятые в качестве разделителя для проверки каждого «раздела» строки на соответствие регулярному выражению, аналогичному оригиналу, но я просто не настолько продвинут в регулярном выражении, чтобы найти решение самостоятельно. Любая помощь будет принята с благодарностью, но в конечном итоге окончательное решение с объяснением будет просто звездным.

Спасибо за чтение этой огромной стены текста!

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Согласно http://www.regular -expressions.info / xml.html язык регулярных выражений, который будет использоваться в XSD, менее выразителен, чем используемый в Java, но достаточно выразителен для вашей задачи.

Теперь для строительства возьмите свое собственное регулярное выражение. Замените точку отрицательным классом символов [^,], чтобы сопоставить все, кроме запятой, и (для большей ясности) объедините шестнадцатеричные классы символов в один. Вы получаете следующее регулярное выражение:

&quot;[^,]+&quot;|\{[0-9a-fA-F ]+\}

Если мы назовем это регулярное выражение <S> (для «единственной строки»), дополнительная функция будет проверена регулярным выражением, совпадающим с любым числом <S>,, за которым следует один <S>:

(<S>,)*<S>

В расширенном виде это дает желаемое регулярное выражение:

((&quot;[^,]+&quot;|\{[0-9a-fA-F ]+\}),)*(&quot;[^,]+&quot;|\{[0-9a-fA-F ]+\})
1 голос
/ 14 мая 2010

Может быть, что-то вроде

(?:(?:"[^,]+?"|\{(?:[0-9]|[a-f]|[A-F]| )+?\}),)*(?:(?:"[^,]+?"|\{(?:[0-9]|[a-f]|[A-F]| )+?\}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...