2015-09-28 2 views
3
$regLinks = "~meaning+?.{0,500}\\.~siU"; 

Мне нужен последний период, \\. быть не внутри меньше, чем знак, и тем больше, чем знак <>. Так что что-то вроде <color blue.> было бы пропущено. Как я могу добиться этого в регулярном выражении?Regex пропускающие периоды внутри меньше, чем знак и больше, чем знак

$string "meaning: sad is when you are unhappy <blue green.> right now."; 

^--- Так из-за этого, вместо того чтобы останавливаться на <blue green.>, он должен остановиться на

meaning: sad is when you are unhappy `<blue green.>` right now. 
+0

Простой поиск (добавленный к '\ .')' (?! [^>] *>) 'Может это сделать. Просьба уточнить, чего вы пытаетесь достичь. –

+0

@stribizhev Думаю? :) У меня есть один из них, чтобы работать, и извлекать определения со словарного сайта! – frosty

+1

Да, но у вас есть 'значение' в регулярном выражении,' color' и 'blue' в примере. Это не так ясно. BTW, 'g +?' Соответствует 1 или больше 'g'. –

ответ

2

Вы можете изменить . в .{0,500} к (?:[^<]|<[^>]*>).

(?:) - группа регулярных выражений, которая не фиксирует (обычная () также будет отображать строку, которую она сопоставила).

< и > просто соответствуют самим себе.

[^>]* соответствует 0 или более признакам >.

В результате вместо согласования "любого символа" (.), мы сопоставляем либо

  • "нормальный" характер (то, что не <)

или

  • a <...> (которая состоит из <, за которой следует 0 или более символов не >, а затем по >)
+0

Отличный ответ! Я это ценю! :) – frosty

+0

Ох. Кстати, так как я пытаюсь также изучить регулярное выражение, можете ли вы объяснить, что такое?: Значит?Я знаю, что [^ <] означает не <, and [^>] означает не a>. Но что означает <посередине, рядом с или, значит? И в конце концов? Что это значит? Благодарю. – frosty

+0

@frosty Обновлен мой ответ. Яснее? – melpomene

1

Попробуйте это:

$regLinks = "~meaning+?(?:[^<]|<[^>]*>){0,500}\\.~siU"; 

Я держал {0,500} немного, потому что я понял, что вы имели причины для этого, хотя это было бы немного более эффективным, чтобы написать:

$regLinks = "~meaning+?(?:[^<]+|<[^>]*>){0,500}\\.~siU"; 

Однако это может привести к произвольному количеству символов.

+0

Это менее эффективно, если в конце концов не получается, потому что теперь вам нужно пройти комбинаторный откат. Если вы хотите оптимизировать этот случай, вы можете использовать «разворачивающийся» трюк Фридла: '[^ <]*(?:<[^>] *> [^ <] *) *' – melpomene

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