Regex - Найти все подходящие слова, которые не начинаются с определенного префикса - PullRequest
14 голосов
/ 10 июня 2011

Как мне создать регулярное выражение, чтобы найти все слова, которые заканчиваются строкой, но не начинаются со строки?

например, Найти все слова, которые заканчиваются на "друг", которые не начинаются сслово "девушка" в следующем предложении:

"A парень и девушка получили друга , когда они попросили друга им "

Элементы в полужирном должны совпадать.Слово 'подруга' не должно.

Ответы [ 4 ]

21 голосов
/ 10 июня 2011

С макушки головы вы можете попробовать:

\b             # word boundary - matches start of word
(?!girl)       # negative lookahead for literal 'girl'
\w*            # zero or more letters, numbers, or underscores
friend         # literal 'friend'
\b             # word boundary - matches end of word

Обновление

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

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

Итак, используя ваш пример, чтобы извлечь все слова, которые либо заканчиваются на friend, либо заканчиваются на girlfriend, вы должны использовать:

\b               # word boundary
(?:              # start of non-capture group 
  girlfriend     # literal (note 1)
|                # alternation
  (              # start of capture group #1 (note 2)
    \w*          # zero or more word chars [a-zA-Z_]
    friend       # literal 
  )              # end of capture group #1
)                # end of non-capture group
\b

Примечания:

  1. Это то, что мы не делаем для захвата.
  2. И это то, что мы делаем для захвата.

Что можно описать как:

  • для всех слов
  • сначала сопоставьте 'girlfriend' и не снимайте (отбрасывайте)
  • затем сопоставьте любое слово, которое является или заканчивается словом «друг», и перехватите его

В Javascript:

const target = 'A boyfriend and girlfriend gained a friend when they asked to befriend them';

const pattern = /\b(?:girlfriend|(\w*friend))\b/g;

let result = [];
let arr;

while((arr=pattern.exec(target)) !== null){
  if(arr[1]) {
    result.push(arr[1]);
  }
}

console.log(result);

который при запуске напечатает:

[ 'boyfriend', 'friend', 'befriend' ]
6 голосов
/ 10 июня 2011

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

/\b(?!girl)\w*friend\b/ig
5 голосов
/ 10 июня 2011

Это может сработать:

\w*(?<!girl)friend

Вы также можете попробовать

\w*(?<!girl)friend\w*, если хотите найти такие слова, как befriended или boyfriends.

Я не уверен, что ?<! доступен во всех версиях регулярных выражений, но это выражение работало в Expersso (которое, я считаю, .NET).

4 голосов
/ 17 декабря 2012

Я изменил ответ Роба Райша на регулярное выражение, которое находит слова, содержащие определенную подстроку, но не содержащие другую конкретную подстроку

\b(?![\w_]*Unwanted[\w_]*)[\w_]*Desired[\w_]*\b

Так, например, \ b (?! [\ W _] * пн [\ w _] *) [\ w _] * день [\ w _] * \ b найдет каждое слово с "днем" (например, день, вторник, дневной ход) в нем, кроме случаев, когда оно также содержит "понедельник" (например, понедельник)

Может быть, кому-то пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...