Regex para extrair parte de um url

votos
3

Eu estou sendo preguiçoso hoje à noite e não quero descobrir isso. Eu preciso de um regex para corresponder 'jeremy.miller' e 'ScottGu' das seguintes entradas:

http://codebetter.com/blogs/jeremy.miller/archive/2009/08/26/talking-about-storyteller-and-executable-requirements-on-elegant-code.aspx

http://weblogs.asp.net/scottgu/archive/2009/08/25/clean-web-config-files-vs-2010-and-net-4-0-series.aspx

Idéias?

Editar

Chris Lutz fez um grande trabalho de atender aos requisitos acima. E se estas foram as entradas para que você não poderia usar 'arquivo' na regex?

 http://codebetter.com/blogs/jeremy.miller/
 http://weblogs.asp.net/scottgu/
Publicado 27/08/2009 em 07:30
fonte usuário
Em outras línguas...                            


2 respostas

votos
7

Será que isso é o que você está procurando?

'/([^/]+)/archive/'

Captura a peça antes de "arquivo" em ambos os casos. Dependendo sabor regex você precisará escapar das /s para que ele funcione. Como alternativa, se você não quer para corresponder à archiveparte, você poderia usar uma visão antecipada, mas eu não gosto lookaheads, e é mais fácil de combinar muito e apenas capturar as peças que você precisa (na minha opinião), então Se você preferir usar uma visão antecipada para verificar que a próxima parte é archive, você pode escrever um você mesmo.

EDIT: Como você atualizar a sua pergunta, a minha idéia do que você quer está se tornando mais nebulosa. Se você quer um novo regex para coincidir com o segundo dos casos, você pode simplesmente arrancar a parte apropriada do final, com as mesmas /condições de antes:

'/([^/]+)/$'

Se você quer especificamente, quer o texto jeremy.millerou scottgu, independentemente de onde eles ocorrem em uma URL, mas apenas como "palavras" no URL (ou seja, não scottgu2), tente isso, mais uma vez, com a /ressalva:

'/(jeremy\.miller|scottgu)/'

Como ainda uma terceira alternativa, se quiser que o campo após o nome de domínio, a menos que o campo é "blogs", ele vai se complicar, especialmente com a /ressalva:

'http://[^/]+/(?:blogs/)?([^/]+)/'

Isto irá coincidir com o nome de domínio, um opcional blogscampo e, em seguida, o campo desejado. A (?:)sintaxe é um não-captura de grupo, o que significa que é apenas como parêntese regular, mas não irá capturar o valor, então o único valor capturado é o valor que você deseja. (?:)tem um risco de variar dependendo do seu sabor regex particular. Eu não sei o idioma que você está pedindo, mas eu predominantemente usar Perl, por isso este regex deve praticamente fazê-lo se você estiver usando PCRE. Se você estiver usando algo diferente, olhar para os grupos de não captura.

Uau. Isso é um monte de falar sobre expressões regulares. Eu preciso para calar a boca e já postar.

Respondeu 27/08/2009 em 07:34
fonte usuário

votos
5

Tente este:

/\/([\w\.]+)\/archive/
Respondeu 27/08/2009 em 07:33
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more