De la parte superior de mi cabeza, usted podría intentar:
\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
actualización
Aquí hay otro enfoque no es evidente que debe trabajar en cualquier aplicación moderna de expresiones regulares:
Suponiendo que desea extraer un patrón que aparece en múltiples contextos, pero solo desea que coincida si aparece en un contexto específico, puede usar una alteración donde primero especifique lo que hace No quiero y luego capturar lo que haces.
Por lo tanto, la utilización de su ejemplo, para extraer todas las palabras que están o fin en friend
excepto girlfriend
, tendrá que utilizar:
\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
Notas:
- Esto es lo que no que capturar.
- Y esto es lo que hacer que capturar.
que se puede describir como:
- para todas las palabras
- primer partido 'Girlfriend', y no captan (descarte)
- entonces encontró ningún palabra que es o termina en ' amigo' y la captura se
en 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);
que, cuando se ejecuta, se imprimirá:
[ 'boyfriend', 'friend', 'befriend' ]
Para preguntas regex, es útil mencionar en qué idioma está trabajando porque puede haber diferencias en la sintaxis de expresiones regulares para la misma tarea. – mrk