2013-11-29 6 views
1

Можно ли совместить все после определенного шаблона?Регулярное выражение - соответствует указанному шаблону

starting-this is my string- 

Например, как в примере выше, я знаю, что строка будет начинаться с некоторыми буквами и дефисом, и затем значение я хочу, который будет прерван другим дефисом.

Таким образом, в данном примере я хочу найти «это моя строка»

Можно ли сделать это с помощью регулярных выражений?

ответ

2

Зависит. Каждая реализация RegExp отличается. Например, вы не можете сделать это в JavaScript, но можете в Ruby. Функция, которую вы ищете, называется «положительный lookbehind».

/(?<=starting-)this is my string(?=-)/ 

У вас есть пример как положительного, так и положительного просмотра назад опережающего просмотр здесь: первый является нулевой шириной утверждения, что за «это» вы «starting-», а второй является нулевой шириной утверждения, что после «строки» у вас есть «-».

Большинство ароматов RegExp имеют взгляд. Некоторые (например, JS) не имеют lookbehind.

Если у вас нет, вы можете сделать некоторые трюки. Самый простой из них является просто сделать без регулярному_выражению просмотра назад, и захватить нужную строку:

/starting-(this is my string)-/ 

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

/#(\w+)#/g 

и попробовать его на нитке, как «моя # лошадь # любит # ест # сено # для # завтрака #», вы бы только получить «лошадь», «съесть» и «за», поскольку матчи для «# eat #» и «# for #» будут потреблять хэши вокруг «сена» и «завтрак».

Другое - это изменение как строки, так и шаблона, вместо этого используйте lookahead; но это ужасно для чтения, а также работает, только если вам не нужны как lookahead, так и lookbehind в том же шаблоне.

+1

Man, вы не правы JS. Рассмотрим «начало» - это моя строка - «. Match (/^start - ([^ -] *) - /)'. – twil

+0

@ twil: Я действительно считал это и отвергал его - вы можете прочитать мой обновленный ответ по этой причине. В частности, попробуйте сопоставить «лошадь», «съесть», «сено», «за», «завтрак» из моего примера, используя свой метод. – Amadan

+0

Ваш ответ хорош, но вы заменяете одну проблему другой и заявляете неправильно о заданном вопросе. – twil

0

Да. Используйте это:

(?<=textyouwanttomatchafter).* 

Этот пример будет работать в java и должен быть похож на другие языки.

1

Это поможет, если вы сообщите нам язык, который вы используете. Для Perl это будет работать:

/starting-([^-]+)-/ 

Строка хранится в $ 1. Один лайнер:

$ perl -le '"starting-this is my string-" =~ m/starting-([^-]+)-/; print $1;' 
this is my string 

Вот an example in JavaScript:

(function() { 
    var str = 'starting-this is my string-'; 
    var matches = str.match(/starting-([^-]+)-/); 
    alert(matches[1]); 
})(); 
+0

Это соответствует более широко, чем «это моя строка». – Amadan

+1

@ Амадан, это соответствует тому, что было задано - какое-то значение между дефисами – twil

+0

Это * фиксирует * то, что было задано. Он * соответствует * более широко. См. Мой ответ для примера, где два не являются взаимозаменяемыми. – Amadan

0

Вы можете использовать это, чтобы захватить группы:

starting\-(.*?)\- 

Матч будет во второй группе.

Вы можете использовать этот один, чтобы соответствовать:

(?<=starting-).*(?=-) 
+0

Это соответствует более широко, чем «это моя строка». – Amadan

+0

Используется для сопоставления групп. – Szymon

+0

Он * соответствует * "start-this is my string-". Он * фиксирует * «это моя строка». Есть разница, которую я указывал. Если вы просто хотите извлечь одно значение, это обычно достаточно; см. мой ответ для ситуации, когда это не так. – Amadan

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