2012-01-31 4 views
0

У меня есть некоторые проблемы делает это регулярное выражение:Создание условного регулярное выражение

Я просто хочу тест регулярного выражения, чтобы потерпеть неудачу, если вход содержит этот символ "<" непосредственно следует буква, то есть что-то вроде: <[^a-zA-Z]

Но я хочу, чтобы он работал, даже если "<" не найден. Как я могу это сделать?

EDIT: некоторые примеры

<Wrong example 
Wrong <Example 

Good Example 
< Good Example 
Good < Example 
Good< Example 
Good Example< 

EDIT 2: При работе с ASP.NET, вы не можете отправить форму с этим текстом в качестве вклада, например:

<Previous 

EDIT 3: Это регулярное выражение будет передано в элементе управления, который я не могу изменить, и он работает путем проверки ввода с помощью регулярное выражение. Поэтому я не могу сравниться с плохим вводом

+0

Принесите примеры. Некоторые действительные и некоторые недопустимые. – Aliostad

+0

Что вы подразумеваете под «работой»? И что вы подразумеваете под «работой, даже если« <1 »не найден»? Регулярное выражение, которое вы указали, будет соответствовать (успешному), если исходная строка содержит две символьные последовательности, состоящие из символа меньшего размера ('<'), за которым следует любой отдельный символ, отличный от буквы A или Z в верхнем или нижнем регистре. Он не будет соответствовать (fail), если исходная строка не содержит эту последовательность. Что именно вы пытаетесь достичь? –

+0

Предположим, у меня есть html-ввод формы, и я не хочу, чтобы пользователь записывал символ меньшего размера, за которым следует символ, потому что это приведет к ошибке. Сервер приложений выйдет из строя, так как будет думать, что это может быть попытка скомпрометировать безопасность, например атаку по сценарию – GianT971

ответ

2

Отрицательные опережение регулярок на его собственный, как

^(?!.*<[a-zA-Z]) 

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

^(?!.*<[a-zA-Z]).*[a-zA-Z] 

В Perl:

while (<DATA>) { 
    print if /^(?!.*<[a-zA-Z])/; 
} 

__DATA__ 
<Wrong example 
Wrong <Example 
Good Example 
< Good Example 
Good < Example 
Good< Example 
Good Example< 

ВЫХОД

Good Example 
< Good Example 
Good < Example 
Good< Example 
Good Example< 
+0

Это прекрасно, я лучше рассмотрю эту способность регулярных выражений, спасибо – GianT971

0

Вы можете использовать [a-zA-Z]*(<[^a-zA-Z])?[a-zA-Z]*.

+0

Спасибо, но на самом деле мое регулярное выражение должно быть именно тем, что я сказал, потому что я передаю его программе, не написанной мной. – GianT971

+0

Вы имеете в виду, что регулярное выражение не должно возвращать совпадений, если есть <сопровождаемое письмом? – m4tt1mus

+0

Он будет использоваться для проверки ввода, и я хочу принять вход для всего, за исключением <<непосредственно с помощью буквы – GianT971

0

EDIT: Возможно, не самый идеальный образец, но это соответствует вашим «хорошим» примерам и не соответствует вашим «неправильным» примерам:

^((^|(<[^a-zA-Z]|[^<a-zA-Z])+)[a-zA-Z]+)+(<[^a-zA-Z]*|[^<a-zA-Z]*)$ 

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

(<[^a-zA-Z])? 

Я предполагаю, что вы строите больше регулярных выражения шаблона, и это только часть его.

+0

Нет, это не сработает ... – GianT971

+0

Я не строю большое регулярное выражение, это единственное условие, которое я хочу проверить – GianT971

+1

Это не сработает, потому что это вызовет большое количество ложных срабатываний и ложных негативов. Он проверит наличие нулевого или одного действительного случая ('<', за которым следует nonalpha), поэтому, если есть два действительных случая, это приведет к ложному отрицанию, и если есть один действительный случай, но также один недопустимый случай ('<' follow по альфа), это приведет к ложному срабатыванию. –

1

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

Отклонить любой входной сигнал, который соответствует следующему регулярному выражению:

<[a-zA-Z] 

Если вам действительно нужно решение белых списков (потому что вы не контролируете фактическую логику проверки, только регулярное выражение), вы могли бы сделать это:

^(?:[^<]|<[^a-zA-Z]|<$)*$ 

(вы можете изменить последнюю Клини звезду плюс, если вы хотите, чтобы убедиться, что вход не пуст.)

+0

Извините, я только что видел ваше решение, он тоже работает, спасибо – GianT971

Смежные вопросы