Pergunta

Por exemplo, neste texto:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc um libero Quis risus sollicitudin imperdiet.

Eu quero corresponder a palavra depois de 'ipsum'.

Foi útil?

Solução

Isso soa como um trabalho para visões traseiras, mas você deve estar ciente de que nem todos os sabores regex apoiá-los. No seu exemplo:

(?<=\bipsum\s)(\w+)

Isso irá corresponder a qualquer sequência de carta caracteres que segue "ipsum" como uma palavra inteira seguido por um espaço. Ele faz não jogo "ipsum" em si, você não precisa se preocupar com a reinserir-lo no caso de, por exemplo, substituições.

Como eu disse, porém, alguns sabores (JavaScript, por exemplo) não suportam lookbehind em tudo. Muitos outros (a maioria, na verdade) suportam apenas "largura fixa" visões traseiras - para que você possa usar este exemplo, mas não qualquer um dos operadores de repetição. (Em outras palavras, (?<=\b\w+\s+)(\w+) que não trabalho.)

Outras dicas

Alguns dos outros respondentes sugeriram usando um regex que não depende de visões traseiras, mas acho que um exemplo completo, de trabalho é necessário para obter o ponto de vista. A idéia é que você combinar toda a sequência ( "ipsum" plus a próxima palavra) da maneira normal, em seguida, usar um grupo de captura para isolar a parte que lhe interessa. Por exemplo:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

Note que este imprime tanto "dolor" e "Nunc". Para fazer isso com a versão lookbehind, você teria que fazer algo hackish como:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

Isso é em Java, o que requer a lookbehind ter um comprimento máximo óbvio. Alguns sabores não têm mesmo que muita flexibilidade, e, claro, alguns não suportam visões traseiras em tudo.

No entanto, os maiores problema pessoas parecem estar a ter em seus exemplos não é com visões traseiras, mas com limites de palavra. Ambos David Kemp e ck parecem esperar \b para coincidir com o caractere de espaço após o 'm', mas isso não acontece; que corresponde à posição (ou limite) entre o 'm' e do espaço.

É um erro comum, que vi repetido mesmo em alguns livros e tutoriais, mas a construção de limite de palavras, \b, não corresponde quaisquer caracteres. É uma afirmação de largura zero, como lookarounds e âncoras (^, $, \z, etc.), e que ele corresponda é uma posição que é ou precedido por um caractere de palavra e não seguido por um, ou seguido de um caractere de palavra e não precedido por um.

ipsum \ b (\ w *)

Com javascript você pode usar (?=ipsum.*?(\w+))

Isto irá obter a segunda ocorrência, bem como (Nunc)

ipsum \ b (. *) \ B

EDIT: embora dependendo de sua implementação regex, esta poderia ser fome e encontrar todas as palavras após ipsum

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top