2012-06-06 2 views
9

Я пытаюсь понять фрагмент кода и наткнулся на это регулярное выражение, используемое в функции preg_replace PHP.Что означает регулярное выражение (? <! -)

'/(?<!-)color[^{:]*:[^{#]*$/i' 

Этот бит ... (?<!-) не появляется ни в одном из моих REG-ехра руководств. Кто-нибудь знает, что это значит, пожалуйста? (Google ничего не возвращает - я не думаю, что символы работают в Google.)

+6

Это смайлик врага Бэтмена удар в левый глаз, но все равно улыбается ... (но это будет соответствовать никому носить подобную шляпу) –

+0

Для справки: [Осмотреться утверждения] (HTTP: // perldoc .perl.org/perlre.html # Look-Around-Assertions) от perlre, [Positive and Negative Lookbehind] (http://www.regular-expressions.info/lookaround.html#lookbehind) на regular-expressions.info. – outis

ответ

10

?<! в начале скобки является negative lookbehind. Он утверждает, что слово color (строго, c в двигателе) не сопровождалось символом -.

Таким образом, для более конкретного примера, это будет соответствовать color в строках:

color 
+color 
someTextColor 

Но это будет не в состоянии на что-то вроде -color или background-color. Также обратите внимание, что двигатель не будет технически «соответствовать» тем, что предшествует c, он просто утверждает, что это не дефис. Это может быть важным различием в зависимости от контекста (illustrated on Rubular with a trivial example; обратите внимание, что толькоb в последней строке соответствует не предыдущей букве).

6

PHP использует perl-совместимые регулярные выражения (PCRE) для функций preg_ *. От perldoc perlre:

"(?<!pattern)"
нулевой длины отрицательный взгляд-за утверждение. Например
"/(?<!bar)foo/" соответствует любому вхождению «foo», что делает
не следует "bar". Работает только для фиксированной ширины -
сзади.

+0

Почему вы не цитируете [PCRE] (http://pcre.org/pcre.txt)? – Gumbo

+0

@Gumbo - Это было бы лучше. Я привел perldoc, потому что я точно знал, где найти информацию. – jordanm

4

Я изучаю регулярные выражения, используя модуль Python re!

http://docs.python.org/library/re.html

Срабатывает, если текущая позиция в строке не предшествует матч за .... Это называется отрицательное утверждение с просмотром назад. Подобно положительным утверждениям lookbehind, содержащийся шаблон должен соответствовать только строкам некоторой фиксированной длины. Шаблоны, начинающиеся с отрицательных утверждений lookbehind, могут совпадать в начале поиска строки.

+1

Python regex не является PCRE, как PHP. – jordanm

+0

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