así que me gustaría obtener palabras entre guiones bajos después de la segunda aparición de guiones bajos
esta es mi cadena
ABC_BC_BE08_C1000004_0124
He ensamblado esta expresión
(?<=_)[^_]+
bueno, coincide con lo que necesito, pero solo omite la primera palabra ya que no hay un guión bajo antes. Me gustaría omitir ABC y BC y solo obtener las últimas tres cadenas, he intentado perder el tiempo pero estoy atascado y no puedo hacer que funcione. ¡Gracias!
Puede usar un enfoque sin expresiones regulares aquí con Split and Skip :
var text = "ABC_BC_BE08_C1000004_0124"; var result = text.Split('_').Skip(2); foreach (var s in result) Console.WriteLine(s);Producción:
BE08 C1000004 0124Vea la demostración de C# .
Con expresiones regulares, puede usar
var result = Regex.Matches(text, @"(?<=^(?:[^_]*_){2,})[^_]+").Cast<Match>().Select(x => x.Value);Vea la demostración de expresiones regulares y la demostración de C# . Las coincidencias de expresiones regulares
(?<=^(?:[^_]*_){2,}) - una mirada positiva hacia atrás que coincide con una ubicación que coincide con los siguientes patrones inmediatamente a la izquierda de la ubicación actual:^ - comienzo de la cadena(?:[^_]*_){2,} - dos o más ( {2,} ) secuencias de cero o más caracteres que no sean _ ( [^_]* ) y luego un _ carácter[^_]+ - uno o más caracteres que no sean _Usign .NET también hay una colección de capturas que puede usar con una expresión regular y un grupo de captura repetido.
^[^_]*_[^_]*(?:_([^_]+))+El patrón coincide:
^ Comienzo de cadena[^_]*_[^_]* Coincide con cualquier carácter excepto _ , coincide con _ y de nuevo con cualquier carácter excepto _(?: grupo de no captura_([^_]+) Haga coincidir _ y capture 1 o más veces cualquier carácter excepto _ en el grupo 1)+ Cierra el grupo de no captura y repite 1 o más vecesdemostración de expresiones regulares de .NET | demostración de C#
Por ejemplo:
var pattern = @"^[^_]*_[^_]*(?:_([^_]+))+"; var str = "ABC_BC_BE08_C1000004_0124"; var strings = Regex.Match(str, pattern).Groups[1].Captures.Select(c => c.Value); foreach (String s in strings) { Console.WriteLine(s); }Producción
BE08 C1000004 0124 Si desea hacer coincidir solo los caracteres de palabra entre los guiones bajos, otra opción para un patrón podría ser usar una clase de carácter negado [^\W_] excluyendo el guión bajo de los caracteres de palabra entre:
^[^\W_]*_[^\W_]*(?:_([^\W_]+))+