2015-12-16 3 views
2

Я новичок в Regex, и хотел бы, чтобы выбрать определенную строку следующее правило:Выберите определенную строку из предложения

Выберите «красивый» (ноль или один) и «people00» или «peopleXXX», если совпадают.

предложение:

  1. "Я красивые, обаятельные и дружественные people00"
  2. "Я красивый, обаятельный и дружественный peopleXXX"
  3. "Я очаровательные и дружественные people00"
  4. «Я очаровательный и дружелюбный человекXXX»

Теперь я использую ниже правило для получения двух струн

(?i)(beautiful|).*(people[a-zA-Z0-9]{2,3}) 

Есть ли способ выбрать его?

Я попытался использовать (beautiful)?.*(people[a-zA-Z0-9]{2,3}), но он не работает.

ответ

2

В регулярном выражении имеется подшаблон, который соответствует жадным точкам. Это .* делает невозможным захват красивым, поскольку он уже соответствует .*. Необязательная группа (beautiful)? или обязательная группа (beautiful|) просто не соответствуют нишу (# 1, группа «не участвует») или первое пространство (# 2). Чтобы этого избежать, вам нужно ограничиться чем-либо, кроме красивым до peopleXXX.

Один из способов заключается в использовании tempered greedy token:

(?i)(beautiful)?(?:(?!beautiful).)*(people[a-zA-Z0-9]{2,3}) 
       ^^^^^^^^^^^^^^^^^^^ 

См demo

(?:(?!beautiful).)* будет соответствовать любому символу, кроме символа новой строки, которая не запускается последовательность beautiful.

Другой способ заключается в использовании развернутую версию этого закаленное жадного лексемы:

(?i)(beautiful)?[^b]*(?:b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3}) 

См another demo

The [^b]*(?:b(?!eautiful)[^b]*)* матчи любой текст, который не запускается последовательность beautiful символов (это будет соответствовать другие символы чем b ноль или более раз ([^b]*), то любое количество последовательностей b не следует eautiful (b(?!eautiful)), а затем следует ноль или более символов от ей, чем b.

Примечание: чтобы сделать это регулярное выражение немного более эффективным, вы можете include a check для peopleXXX:

(?i)(beautiful)?(?:(?!beautiful|people[a-zA-Z0-9]).)*(people[a-zA-Z0-9]{2,3}) 

и unrolled one:

(?i)(beautiful)?[^bp]*(?:p(?!oeple[a-zA-Z0-9])[^p*]|b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3}) 
+0

Спасибо вам так много, это то, что мне нужно. Я буду искать (? :) и (?!) – Benson

+0

Вы должны проверить объяснение [tempered greedy token] (http://www.rexegg.com/regex-quantifiers.html#tempered_greed). Он состоит из группы без захвата ('(?: ...)') и отрицательного lookahead '(?! ...)'. –