Usaremos abaixo do regex para obter os dígitos antes das palavras.
Exemplo:
838123 someWord 8 someWord 12 someWord
(\d+)\s*someWord
Mas, às vezes, qualquer coisa fica entre Número e palavra. Consulte a linha de exemplo abaixo.
Ex:
43434 de alguma coisa 12 alguma coisa alguma 2323 nova alguma coisa
Como obter o dígito exato antes dessa palavra usando regex?
Por favor me dê suas sugestões.
Respostas:
Faça isso:
(\d+)[^\d]+some[wW]ord
Você precisa aceitar algo diferente de dígitos. Também considerei os dois
w
eW
já que seus exemplos continham ambos.Demo
fonte
Presumindo que "qualquer coisa" não inclua dígitos, você pode usar este regex:
Demonstração sobre regex101
fonte
Um possível "caso esquecido" da resposta do CinCout é se a correspondência
someWord
deve ser exata, por exemplo, senotsomeWord
esomeWordNotThis
não deve ser correspondida.A seguinte extensão para essa expressão regular fornece uma maneira de resolver isso:
(\d+)[^\d]*[^\w]some[wW]ord[^\w]
Explicação: O
[^\w]
antes ou o depois do correspondente parasomeWord
pesquisador procurar um "caractere que não seja palavra" antes e depois dele - um final da linha também conta aqui. Obviamente, isso pode se tornar mais complexo / específico, dependendo dos requisitos exatos.Demo
fonte
Você pode tentar algo como isto:
Você pode ver o teste aqui
fonte
primeiro separou o
some[wW]ord
,number
espace
com um padrão, depois execute o segundo padrão neleQuando o primeiro padrão é executado, a sentença será a desejada
mudança:
fonte
Mas, às vezes, qualquer coisa fica entre Número e palavra. Consulte a linha de exemplo abaixo.
Ex:
tente isso
Explicado
Demo
fonte
Usando
\s*
corresponderá apenas a 0 ou mais caracteres de espaço em branco.Você poderia usar
\D+
mas também corresponderá às novas linhas, pois corresponde a qualquer caractere, exceto um dígito.Se você deseja corresponder os dígitos na mesma linha, pode adicionar uma linha não correspondente a uma classe de caracteres negada
[^\d\r\n]
No seu exemplo, você usa
\d
, mas se você deseja apenas combinar 1 ou mais dígitos de 0 a 9, pode usar uma classe de caractere[0-9]+
Para impedir que os dígitos e a palavra façam parte de uma palavra maior, você pode usar limites de palavras
\b
Se você deseja corresponder a palavra de uma maneira que não diferencia maiúsculas de minúsculas, você pode usar
RegexOptions.IgnoreCase
ou um modificador embutido(?i)
Veja uma demonstração do regex .NET
fonte
Use capturas de correspondência nomeadas (para obter dados, use
mtch.Groups["Value"].Value
... etc) para extrair as informações conforme necessário.Quando o acima é executado ( com a
IgnorePatternWhiteSpace
remoção dos comentários, junte-se ao padrão para executá-lo, como(?<Value>\d+)(?<Other>.+?)(?<Key>someword)
sem opções de regex ), ele obtém os dados para cada par de Dados / Chave e organiza cada um em uma única correspondência.Resultado
Aqui está o resultado (para o seu segundo exemplo), que está contido em correspondências individuais e seus grupos e capturas fornecem em cada correspondência:
Visualmente, aqui está o que corresponde:
fonte