2012-03-06 1 views
3

я должен соответствовать группам строк, которые имеют в качестве границ на «__» обугленная последовательность (два подчеркивания)как соответствовать группам строк, которые не содержат подстроку

, например:

hello __1the_re__ my name is __pe er33__ 

«1the_re» и «ре er33» должны соответствовать

моя проблема определения «строка, которая не содержит последовательность символов»

/__((?!__).*)__/ 

Ive пробовал это, но он не работает ...

спасибо!

ответ

3

Вы близки:

/__((?!__).)*__/ 

работы. Звезда должна находиться за пределами повторяющейся группы, поэтому просмотр выполняется в каждой позиции, а не сразу после ведущего __.

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

/__((?:(?!__).)*)__/ 
+0

приятный! ok теперь я понимаю, что было не так с моим регулярным выражением, спасибо! – skyline26

0

Вы можете использовать не жадный знак: "?".

/__((?!__).*?)__/g 
// javascript: 
>>> "hello __1the_re__ my name is __pe er33__".match(/__((?!__).*?)__/g) 
["__1the_re__", "__pe er33__"] 
+3

Это не имеет большого смысла - если вы сделаете квантификатор ленивым, вам не потребуется утверждение lookahead. –

1

Внутри вашей группировки, вы хотите, чтобы соответствовать одному из следующих вариантов:

  1. Любой символ, за которой следует любой символ, не _.
  2. Любой персонаж не _

Regex:

/__(.[^_]|[^_])*__/ 

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

/__((?:.[^_]|[^_])*)__/ 

Пример:

$subject = 'hello __1the_re__ my name is __pe er33__'; 
$pattern = '/__((?:.[^_]|[^_])*)__/'; 
$r = preg_match_all($pattern, $subject, $match); 
print_r($match[1]); 

Выход:

Array 
(
    [0] => 1the_re 
    [1] => pe er33 
) 

Но, очевидно, это просто намного проще сделать квантор lazy:

/__(.+?)__/ 

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

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