¿Cómo obtener los dígitos antes de una palabra en particular usando regex en c #?


10

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.


3
Parece que las publicaciones existentes responden tu pregunta. Informe a los respondedores y futuros lectores si encuentra útiles las respuestas (Haga un recorrido ). De lo contrario, proporcione más detalles sobre lo que está buscando y por qué las respuestas no son adecuadas para su caso.
Reza Aghaei

1
No está claro lo que estás preguntando ...
JohnyL

Respuestas:


14

Hacer esto:

(\d+)[^\d]+some[wW]ord

Debe aceptar cualquier otra cosa que no sean dígitos. También consideré ambos wyW dado que sus ejemplos contenían ambos.

Manifestación


¿Estás buscando una respuesta diferente?
Reza Aghaei

@RezaAghaei quizás
CinCout

¿Cuáles son los problemas con la respuesta actual que proporcionó? ¿Qué mejoras estás buscando?
Reza Aghaei

@RezaAghaei El hecho de que OP no haya aceptado ninguna respuesta todavía me hace pensar si me perdí un caso de esquina o algo así. Los enfoques alternativos para resolverlo también son bienvenidos.
CinCout

1
@ CinCout-ReinstateMonica Consulte mi respuesta para un posible caso de borde perdido (no estoy seguro si esto es relevante para el OP).
Steve Chambers

4

Suponiendo que "cualquier cosa" no incluye dígitos, puede usar esta expresión regular:

(\d+)[^\d]+someWord

Demo en regex101


3

Un posible "caso de esquina perdido" de la respuesta de CinCout es si la coincidencia someWorddebe ser exacta, por ejemplo, si notsomeWordysomeWordNotThis 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 para someWordbuscar 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


3

Podrías probar algo como esto:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

Puedes ver la prueba aquí


3

primero separó el some[wW]ord, numbery spacecon un patrón, luego ejecuta el segundo patrón en él

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

Cuando se ejecuta el primer patrón, la oración será la deseada

43434 de someword 12 algo someword 2323 new someword

cambio:

43434 someword 12 someword 2323 someword


2

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

prueba esto

(\ d +) (. *?) alguna palabra

Explicado

\ d + - números

. *? - cualquier cosa después de los números pero ocurrencia mínima.

someword - coincidencia exacta de algo

Manifestación


2

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.IgnoreCaseun modificador en línea(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

Vea una demostración de expresiones regulares .NET


2

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.

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

Cuando se ejecuta lo anterior ( de lo IgnorePatternWhiteSpacecontrario, 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:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

Visualmente, esto es lo que coincide:

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.