Regex - если содержит «%», может содержать только «% 20» - PullRequest
5 голосов
/ 02 декабря 2009

Я хочу создать регулярное выражение для следующего сценария:

Если строка содержит символ процента (%), то она может содержать только следующее: %20, и перед ней не должно стоять другое '%'.

Таким образом, если бы было, например, %25, оно было бы отклонено. Например, допустима следующая строка:

http://www.test.com/?&Name=My%20Name%20Is%20Vader

Но это не получится:

http://www.test.com/?&Name=My%20Name%20Is%20VadersAccountant%25

%%%25

Любая помощь будет принята с благодарностью,

Кайл


EDIT:

Сценарий в двух словах заключается в том, что ссылка записывается в закодированное состояние и затем запускается через JavaScript. Нет расшифровки работает. Я пробовал декодирование .net и JS, каждое из которых имеет одинаковый результат - результаты остаются закодированными при выполнении.

Ответы [ 9 ]

5 голосов
/ 02 декабря 2009

Не требует%:

/^[^%]*(%20[^%]*)*$/
2 голосов
/ 02 декабря 2009

Какой язык вы используете?

Большинство языков имеют функцию или класс Uri Encoder / Decoder. Я бы посоветовал вам сначала декодировать строку, а затем проверять действительные (или недействительные) символы.

т.е. что-то вроде / [\ w] / (пустое пространство)

Прежде всего, с помощью регулярного выражения вы должны учитывать, что www.example.com/index.html?user=admin&pass=%%250 означает, что проход действительно равен "% 250".

1 голос
/ 02 декабря 2009

Отклонить строку, если она соответствует %[^2][^0]

1 голос
/ 02 декабря 2009

Другое решение, если осмотры недоступны:

^([^%]|%([013-9a-fA-F][0-9a-fA-F]|2[1-9a-fA-F]))*$
1 голос
/ 02 декабря 2009

Я думаю, что нашел бы то, что вам нужно

/^([^%]|%%|%20)+$/

Редактировать : добавлен регистр, где %% является допустимой строкой внутри URI
Edit2 : И исправил это для случая, когда он должен потерпеть неудачу: -)
Edit3

Если вам нужно использовать его в редакторе (что объясняет, почему вы не можете использовать более программный способ), тогда вы должны правильно экранировать все специальные символы, например, в Vim, что регулярное выражение должно появляться:

/^\([^%]\|%%\|%20\)\+$/
0 голосов
/ 02 декабря 2009

Для этого требуется проверка на «плохие» паттерны. Если мы разрешаем %20 - нам не нужно проверять, существует ли он.

Как уже говорили другие, %% тоже допустимо ... и %%25 будет %25

Данное регулярное выражение соответствует всем, что не вписывается в вышеприведенные правила

/(?<![^%]%)%(?!(20|%))/

Первые квадратные скобки проверяют, есть ли символ% перед символом (это означает, что он %%), а также проверяет, не является ли он %%%. Затем он проверяет% и проверяет, не соответствует ли элемент после 20

Это означает, что если регулярное выражение идентифицирует что-либо, то вам, вероятно, следует отклонить его.

0 голосов
/ 02 декабря 2009
/^([^%]|%20)*$/
0 голосов
/ 02 декабря 2009

Я согласен с комментариями Доминика по этому вопросу. Не используйте Regex.

Если вы хотите избежать сканирования строки дважды, вы можете просто итеративно искать %, а затем проверить, что за ним следует 20 и ничего больше. ( Обновление: разрешить интерпретацию % после буквальной %nnn последовательности)

// pseudo code
pos = 0
while (pos = mystring.find(pos, '%'))
{
     if mystring[pos+1] = "%" then
         pos = pos + 2 // ok, this is a literal, skip ahead
     else if mystring.substring(pos,2) != "20" 
          return false; // string is invalid
     end if
}
return true;
0 голосов
/ 02 декабря 2009

Возможно, лучшим подходом является обработка этой проверки после того, как вы декодируете эту строку:

string name = HttpUtility.UrlDecode(Request.QueryString["Name"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...