2013-02-28 1 views
1

Мне нужно получить следующее регулярное выражение для работы, но с проблемами. Да, это разбор HTML. Нет, нет лучшего варианта использования.Класс отрицательных символов с переменными и точка-звездочка

Это регулярное выражение:

test(.*)\/[^s].*(=|\/|Z) 

Я использую модификатор "U" (так это ungreedy), и "\" это мой символ спасения.

Подключив в этой схеме:

test.com/sch/anythingwhateverZhello 

Результаты в матче, когда я не думаю, что должен. Захваты - это «.com/sch» и «Z», хотя я (думаю), я конкретно сказал, что он должен A) захватывать только до первого «/», поэтому он должен быть «.com» и B) не совпадают, если первая буква после «/» - это «s». Интересно - и вероятный источник моей проблемы - когда я удаляю [^ s], захват теперь работает правильно. С его помощью звездочка поглощает второй «/», что не имеет смысла. Я попытался поставить вопросительный знак после звездочки, как двойной намек на регулярное выражение, что он не должен быть жадным, но это не имело значения.

ОК, так что вместо инверсный класса символов (я действительно не хочу, чтобы исключить только «S», я действительно хотел бы, чтобы исключить «СХ» в частности), следующий раз я попробовал отрицательный предпросмотр:

test(.*)\/(?!sch).*(=|\/|Z) 

Такая же проблема! Совпадение и первый захват - «.com/sch».

Любые идеи, что моя ошибка здесь? (Я использую валидатор RexV2 regex по адресу http://www.rexv.org/, поэтому мне пришло в голову, что в этом движке может быть ошибка, но я могу воспроизвести эту проблему в своей живой среде).

+1

'test (. *)' Это ваша проблема. Может быть, это должно быть 'test ([^ \ /] *)'? Так оно и есть, это соответствует 'test.com/sch', а затем'/', а затем' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Shef

+1

Ты, сэр, гений. Это исправило это. Я до сих пор не понимаю, почему неграмотность (. *) Не останавливается на первом «/» (и действительно, это происходит, когда после него нет [^ s]), но я оставлю это для дальнейших ученых. Кстати, ваше исправление также делает работу с обзором. Спасибо! – FoulFoot

+0

Отлично, я отправлю это как ответ, и вы сможете пометить свой вопрос как решенный. – Shef

ответ

0

test(.*) это ваша проблема. Может быть, это должен быть тест ([^ /] *)?

Так оно и есть, это соответствие test.com/sch, потому что . означает любой символ, а затем / и тогда нет в anythingwhateverZhello нет s, поэтому он продолжает идти.