2013-03-31 2 views
-1

Я ищу regrex, который соответствует только 3, 6, 9, 12, 15, 18, ..... и т. Д. Слова «бла» в следующем тексте и игнорирует первый, второй, четвёртой, пятой, седьмой, восьмой, .... и т.д. регулярное выражение должно соответствовать 3x вхождений только блаregex query nth match

The Band blah The Band blah blah Up On Cripple Creek (2000 Digital Remaster) blah 2000 blah Greatest Hits blah The Band blah blah The Weight (2000 Digital Remaster) blah 2003 blah Rhythm Of The Rain blah The Cascades blah blah Rhythm Of The Rain (LP Version) blah 2005 blah Chronicle Volume One blah Creedence Clearwater Revival blah blah Who'll Stop the Rain blah 1976 blah The Complete Sun Singles, vol. 1 blah Johnny Cash blah blah I Walk the Line blah 2001 blah Greatest Hits blah Bob Seger blah blah Against The Wind blah 1980 blah Their Greatest Hits blah The Eagles blah blah Lyin' Eyes blah 1975 blah Johnny Horton's Greatest Hits blah Johnny Horton blah blah North To Alaska 

Спасибо заранее.

FYI, я буду использовать это регулярное выражение в улье

+0

Какую цель? Получение индексов, их замена ..? – Loamhoof

+0

, чтобы разделить на строку, используя http://svn.apache.org/repos/asf/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSplit.java – user1309258

+0

Too ленив, чтобы прочитать все это, но я предполагаю, что вы хотите поймать только «бла» и ничего больше, поскольку это слишком много. – Loamhoof

ответ

0
'(?:(?:.+?)blah(?:.+?)blah(?:.+?)(blah))' 

Это должно работать, хотя я не уверен, что если регулярное выражение является лучшим решением для очень длинных текстов

отредактирован, чтобы избежать первого захватывая ... хотя понятно, что ОП не понимаю, как regexpal работы

+0

Я тестировал его с помощью regexpal, и он не работает. Http://bit.ly/120DiLK – user1309258

+0

Это не мое регулярное выражение, «+» отсутствуют (и оно работает с'em). Вы понимаете, что делаете? Инструменты, которые вы используете? Вы должны попробовать «расколоть». – bobrobbob

2

Хороший и компактный:

(?:blah.*?){2}(blah) 
+0

Я только что протестировал и не работает – user1309258

+0

regexpal Ссылка слишком длинная, чтобы скопировать ее здесь – user1309258

+0

Можете ли вы похудеть/tinyurl ссылку? – nneonneo

0

Как я не думаю, что оба предыдущих ответа - это то, что вы хотите (из того, что вы сказали в комментариях), я тоже стану здесь.
Отказ от ответственности: Я не думаю, что есть эффективный способ поймать только 3-й бла, но все же вы можете это сделать.
Шаг 1: Обратить вспять строку, вам понадобится произвольная длина lookbehind, которую вы не сможете получить. Но вы будете иметь их, обратив строку и используя произвольный просмотр.
Шаг 2: ниже регулярное выражение должно поймать то, что вы хотите:

/halb(?=(?:(?:[^h]|h(?!alb))*halb){2}(?:[^h]|h(?!alb)|halb(?:(?:[^h]|h(?!alb))*halb){2})*$)/ 

Шаг 3: попытаться изменить порядок/назад ...

(Примечание: так как я очень сонным, Я не проверял, и было бы исправить, если это необходимо в течение нескольких часов ...)

Edit:
Хорошо, теперь исправлено. Так оно работает, но у вас все еще есть строка назад. Вам придется отменить все строки в вашем массиве, а затем ваш массив. Но все же, it works. Еще раз, если у вас проблемы с производительностью, вы можете попробовать сыграть с притяжательными квантификаторами, если сможете.

+0

Спасибо Loamhoof, но я дал ему попробовать, и он не работает. – user1309258

+0

Хорошо, я буду копаться в нем, когда у меня есть свободное время. (После быстрого теста он соответствует 3-му, 4-му, 5-му и так далее ... Я проверю, почему позже). – Loamhoof

+0

@ user1309258 см. Мое редактирование. Тем не менее, некоторые работы по достижению результата. – Loamhoof