2013-08-14 8 views
0

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

border-.*\.5pt 

найти все border-top, border-bottom и т.д. свойства CSS в файле с пограничной толщиной .5pt. Он вообще отлично работает, но он слишком жадный.

Например все ниже возвращается в одной игре:

border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt 

Я хочу, чтобы эти два свойства CSS, чтобы быть два отдельных матчей.

Так что я попытался изменить мое регулярное выражение:

border-.*?\.5pt 

Использование ?, чтобы сделать его не жадный. Однако после этой модификации ничего не соответствует.

Может ли кто-нибудь объяснить, почему я вижу это поведение? Что мне не хватает?

(если это стоит знать, я использую Microsoft Expression Web на «найти с регулярными выражениями» при выполнении этого поиска.)

+1

[Я могу только сказать, что он работает здесь] (Http: //regex101.com/r/wV7lF6), так что, возможно, это регулярное выражение вашего приложения ... – Wrikken

+0

@Wrikken, вы правы. Я неправильно предполагал, что в синтаксисе regex в продуктах Microsoft будет согласованность. Оказывается, PowerShell (ссылка, которую я использовал) имеет разные операторы, чем Expression Web. Урок выучен. Спасибо, что посмотрели! –

ответ

8

Существует не один «регулярное выражение» язык. Хотя существуют общие общие черты, детали отличаются от реализации к реализации. Многие регулярные выражения используют - как не-жадные «0 или более», другие используют *?. Видимо, Microsoft Expression Web uses @.

Короче говоря, регулярные выражения могут отличаться, поэтому вам часто требуется RTM для той, которую вы используете, чтобы найти ее диапазон возможностей и подробный синтаксис (т. Е. Поддержку изменения/возврата/etc., Группировки символов, набора стенография и т. д.)

+0

Спасибо. Это фиксировало это. Я не понимал, что даже при изменении синтаксиса регулярных выражений продуктов Microsoft. Я использовал ссылку regex PowerShell, предполагая, что она применима к Expression Web. Спасибо за ответ. Полезно знать о будущем. –

3

.*? является самым большим, так сказать, «антипаттерном» для регулярных выражений. Он обычно используется как шаблон «Match-something-the-string-i-want», но это не так.

Особенно при объединении нескольких .*? в пределах одного рисунка, это может привести к очень неправильным и неожиданным результатам.

Для вашего случая - как указано в комментариях - он работает. (Может быть, вы что-то сделали не так?)

Однако, при создании шаблона регулярных выражений ВСЕГДА хорошая идея быть более конкретным. ВСЕГДА ХРАНИТЕ В РАЗУМЕ, что .*? может быть НИЧЕГО. Кроме того, вы действительно не хотите соответствовать!

В вашем примере, я хотел бы использовать что-то вроде этого: border-(?:[^:]+):\s*(?:[^\s]+)\s+(?:\#[a-fA-F0-9]{6})\s+(?:\d*(?:\.\d+)?)pt;?

Это более специфично, но соответствует данным требованиям, игнорирует все пробелы, которые не делают Sence, и даже спички границ ширины, regardles если они написаны как .2, 3 или 4.1. Если вы удалите ?: из групп единого соответствия, вы также можете сопоставить каждый отдельный атрибут, если это необходимо. : Позиция, Тип границы, Цвет и толщина.

Узор border-([^:]+):\s*([^\s]+)\s+(\#[a-fA-F0-9]{6})\s+(\d*(?:\.\d+)?)pt;? с вашей строки border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt будет соответствовать:

Первый матч:

1.top 
2.solid 
3.#1F497D 
4..5 

Второй матч:

1.bottom 
2.solid 
3.#1F497D 
4..5 

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

  • Нет связанных вопросов^_^