2012-02-23 4 views
2

Я динамически создаю регулярное выражение.Регулярное выражение или несколько или одиночные символы

Я хочу, чтобы соответствовать следующим образом:

lem 
le,,m 
levm 
lecm 

В принципе, «Лем», но до м он может иметь любое количество , или любой из любого характера. Сейчас у меня есть

le[\,]{0,}[.]?m 

вы можете увидеть его на http://regexr.com?303ne

Он должен соответствовать каждый, но третий.

Update: Я понял это:

le[\,]{0,}.?m 
+0

Можете ли вы описать, какие входы соответствуют, а какие нет? –

+0

Хорошо, я добавил несколько примеров ввода. – LemonPie

+0

@ LemonPie: Как насчет «LemonPie»? Это соответствует или нет? I.e., должны ли удвоенные символы быть последовательными, чтобы матч терпел неудачу? –

ответ

4

Всякий раз, когда вы думаете "или" в регулярных выражениях, вы должны начать с чередованием:

a|b 

матчи либо a или b.Так

любое число из списка символов OR 1 любого символа

можно перевести буквально на

[...]*|. 

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

le([,]*|.)m 

Поскольку символьный класс имеет только один элемент, мы можем упростить это:

le(,*|.)m 

Обратите внимание, что . по умолчанию означает «любой символ, кроме символа новой строки».

+1

просто FYI - это не вежливо, чтобы опросить ответы который ответил на первый пересмотр вопроса. Я не виноват, что ОП изменил вопрос – zerkms

+0

@ zerkms Согласно мобильному интерфейсу, последнее обновление OP было 1 час назад. Последнее обновление для вас было 59 минут назад. – PointedEars

+0

, так что я должен был быть F5 все время, чтобы увидеть, изменит ли OP свой ум? Я отвечаю на исходный вопрос, получая детали один за другим (и вы знаете - это не моя вина, что исходный вопрос и все другие изменения не содержали всю необходимую информацию за мгновение), и в самом конец я получил downvote ... perfect – zerkms

0

Как об этом один:

([^,])(?=\\1) 

Но это делает наоборот :-) Не уверен, если это нормально для вас

UPD

это должно работать для вас:

~^(?:,|([^,])(?!\\1))+$~ 

не уверен, что диалект вы ищете, но он работает в PCRE: http://ideone.com/6Q3Wk

UPD2:

тот же регулярок включены в другом

$r = '(?:,|([^,])(?!\\1))+'; 
var_dump(preg_match('~le' . $r . 'm~', 'leem')); 

В этом случае окончательное выражение становится: le(?:,|([^,])(?!\\1))+m где le и m добавляются вокруг шахты без изменений

+0

Это похоже на любой символ, кроме a, – LemonPie

+0

@LemonPie: он делает противоположную работу. Если вы можете инвертировать результат - тогда он отлично подходит для задачи – zerkms

+0

Я не верю, что это сработает для моих целей, поскольку я создаю фильтр ненормативной лексики. – LemonPie

2

Что об этом:

le(,*|.?)m 

он должен делать то, что вы хотите.

+0

'(, *)?' неэффективен. Используйте 'le (, * |.?) m'. – PointedEars

+0

Спасибо за подсказку, я изменил его. – morja

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