2014-01-29 2 views
1

Это, вероятно, так же просто, как это получается, но я впервые видел регулярные выражения, и все остальные в классе, по-видимому, уже приняли еще один класс. Главное, что я не следую, - использовать кароту (предположительно, чтобы разрешить все, кроме того, что после нее).Регулярное выражение, исключающее подстроку

Так что проблема:

Дайте регулярное выражение для: Все строки над {0,1,2}, которая не включает в себя подстроку 12.

Я знаю (0 | 1 | 2) * будут все строки. Тем не менее, вы хотите, чтобы избежать 12. Как я смотрю на это, что вы просто не хотите 2 после 1, поэтому я ставлю:

(0|1[^2]|2)* 

так, как я прочитал это, если это 0, положите 0 и снова скопируйте; если это 1, поставьте 1 и SOMETHING, что не является 2. Однако технически «ничего» - это что-то, так что бы оно возвращалось и было как 1 [ничего], кругом и помещало 2, тем самым делая это 1 [ничего] 2 = 12? Или это будет так, как я надеюсь, и убедитесь, что 2 никогда не придет после 1, продолжая продолжать процесс?

Я не совсем уверен, что если то, что я сказал, имеет смысл, так что просто дайте мне знать, если вам нужны разъяснения, и я попытаюсь хехе

Спасибо заранее.

Шон

+0

Какой класс? Регулярные выражения в области информатики? Или курс программирования с регулярными выражениями? Использование и терминология различаются. – Bergi

ответ

1

Главное, я не следующий использует carot (должен позволить все, что после него, кроме).

Возможно, вы имеете в виду caret? Посмотрите на negated character classes.

[...] поставил 1 и то, что никогда не 2. Однако, технически «ничего» что-то, так что бы он вернулся вокруг и быть как 1 [ничего], круг вокруг и положить 2, таким образом, это 1 [ничего] 2 = 12?

№ Класс персонажа всегда соответствует точно одному символу, он ничего не может сопоставить. Выражение [^2] не означает «ничего, включая ничего, - это не 2», а конкретно «одна вещь, которая не является 2». Однако можно было сделать это optional явно.

Или это будет так, как я надеюсь, и убедитесь, что 2 никогда не придет после 1, продолжая продолжать процесс?

Да. Тем не менее, он всегда требует по крайней мере одного символа после 1, поэтому строка, которая заканчивается на 1, также будет недействительной. Вы должны позволить 1 с в конце концов в явном виде:

(0|1[^2]|2)*1* 
+0

ах .. да ... уход, извините. Итак, если [^ 2] нужно сопоставить чему-то, что, если строка заканчивается на «1»? Поэтому, если вы хотите 021, у вас будет 021 [^ 2]. Ничто не прекратило бы его сразу после 1, правильно? – user2869231

+0

Если строка заканчивается символом «1», регулярное выражение не будет совпадать, так как оно «требует» «один символ, который не является двумя» после «1». Проверьте последний параграф моего ответа. – Bergi

+0

ah gotcha. Спасибо – user2869231

2

Ваше регулярное выражение будет обрабатывать символы из строки ввода по одному. Ваше регулярное выражение будет соответствовать строке «112», которая не соответствует вашим требованиям. (Первый «1» будет соответствовать 1 в вашем шаблоне, а затем второй «1» будет соответствовать [^ 2], потому что «1» не равен 2. Затем он будет соответствовать «2» в строке против 2 в шаблоне.

Вам нужен способ сказать «1, за которым не следует 2», хотя на самом деле «не потребляет» символ после 1. Вот регулярное выражение, которое делает это, но для этого требуется отрицательный прогноз:

^(?:0|1(?!2)|2)*$ 

Это говорит о том, что вся строка (именно поэтому я использую^и $ якоря) должна состоять из символов в скобках выражения: либо «0», «2» или «1» за которым сразу не следует «2».

+0

Вы избили меня до этого ... – Cu3PO42

+0

Я оказался в том же классе, что и OP, и мы не только не рассматриваем якорь^$ (я считаю, что предполагается, что вся строка ДОЛЖНА быть прочитана, поэтому эти символы не нужны. Я думаю, что это ужасный способ научить регулярному выражению.). Наш учитель также никогда не упоминал о негативном взгляде вперед и нашей книге. Можно с уверенностью предположить, что нам не разрешат использовать его. Это класс теории компиляторов. –

0

Я признаю, что я основал свой ответ на Берги, но мой не примет 112 (или 1112, или 11112 и т. Д.).

(0|1+[^12]|2)*1* 

Я проверил это регулярное выражение здесь: http://regexhero.net/tester/

надеюсь, что вы видите это, прежде чем включить его в завтра ...

EDIT: Для того, чтобы проверить его должным образом, пожалуйста, используйте^и $ якорей, о которых упоминал Петтит. Однако не включайте их при включении домашней работы.

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