Usaremos la expresión regular debajo para obtener los dígitos antes de las palabras.
Ejemplo:
838123 someWord 8 someWord 12 someWord
(\d+)\s*someWord
Pero a veces cualquier cosa se interpondrá entre Número y palabra. Consulte la siguiente línea de ejemplo.
Ex:
43434 de someword 12 algo someword 2323 new someword
¿Cómo obtener el dígito exacto antes de esa palabra usando regex?
Por favor dame tus sugerencias.
Respuestas:
Hacer esto:
(\d+)[^\d]+some[wW]ord
Debe aceptar cualquier otra cosa que no sean dígitos. También consideré ambos
w
yW
dado que sus ejemplos contenían ambos.Manifestación
fuente
Suponiendo que "cualquier cosa" no incluye dígitos, puede usar esta expresión regular:
Demo en regex101
fuente
Un posible "caso de esquina perdido" de la respuesta de CinCout es si la coincidencia
someWord
debe ser exacta, por ejemplo, sinotsomeWord
ysomeWordNotThis
no debe ser emparejado.La siguiente extensión de esa expresión regular proporciona una manera de abordar esto:
(\d+)[^\d]*[^\w]some[wW]ord[^\w]
Explicación: El
[^\w]
antes o después de la matcher parasomeWord
buscar un "carácter no-palabra" antes y después de él - un extremo de la línea también cuenta aquí. Por supuesto, esto podría hacerse más complejo / específico, dependiendo de los requisitos exactos.Manifestación
fuente
Podrías probar algo como esto:
Puedes ver la prueba aquí
fuente
primero separó el
some[wW]ord
,number
yspace
con un patrón, luego ejecuta el segundo patrón en élCuando se ejecuta el primer patrón, la oración será la deseada
cambio:
fuente
Pero a veces cualquier cosa se interpondrá entre Número y palabra. Consulte la siguiente línea de ejemplo.
Ex:
prueba esto
Explicado
Manifestación
fuente
El uso
\s*
solo coincidirá con 0 o más caracteres de espacio en blanco.Puede usar,
\D+
pero también coincidirá con las nuevas líneas, ya que coincide con cualquier carácter excepto un dígito.Si desea hacer coincidir los dígitos en la misma línea, puede agregar una línea nueva que no coincida con una clase de caracteres negada
[^\d\r\n]
En su ejemplo, usa
\d
, pero si solo desea hacer coincidir 1 o más dígitos 0-9 , puede usar una clase de caracteres[0-9]+
Para evitar que los dígitos y la palabra formen parte de una palabra más grande, puede utilizar los límites de las palabras.
\b
Si desea hacer coincidir la palabra de una manera que no distinga entre mayúsculas y minúsculas, puede usar
RegexOptions.IgnoreCase
un modificador en línea(?i)
Vea una demostración de expresiones regulares .NET
fuente
Utilice las capturas de coincidencia con nombre (para obtener el uso de datos
mtch.Groups["Value"].Value
... etc.) para extraer la información según sea necesario.Cuando se ejecuta lo anterior ( de lo
IgnorePatternWhiteSpace
contrario, elimine los comentarios y únase al patrón para ejecutarlo, como(?<Value>\d+)(?<Other>.+?)(?<Key>someword)
sin opciones de expresiones regulares) ), obtiene los datos para cada par de Datos / Claves y organiza cada uno en una sola coincidencia.Resultado
Aquí está el resultado (para su segundo ejemplo) que están contenidos en partidos individuales y sus grupos y capturas proporcionan en cada partido:
Visualmente, esto es lo que coincide:
fuente