2009-07-23 13 views
24

bien, este me está volviendo loco .... tengo una cadena que se forma así:expresión regular que coincide con una nueva línea ( n) en C#

var newContent = string.Format("({0})\n{1}", stripped_content, reply) 

newContent mostrará como:
(texto antiguo)
texto nuevo

Necesito una expresión regular que elimine el texto entre paréntesis con el paréntesis incluido Y el carácter de nueva línea.

Lo mejor que puedo llegar a decir:

const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
var match= Regex.Match(original_content, regex); 
var stripped_content = match.Groups["capture"].Value; 

Esto funciona, pero quiero específicamente para que coincida con la nueva línea (\n), no cualquier espacio en blanco (\s) Sustitución \s con \n\\n o \\\n hace No trabajo.

¡Por favor, ayúdame a mantener mi cordura!

EDIT: un ejemplo:

public string Reply(string old,string neww) 
     { 
      const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
      var match= Regex.Match(old, regex); 
      var stripped_content = match.Groups["capture"].Value; 
      var result= string.Format("({0})\n{1}", stripped_content, neww); 
      return result; 
     } 

Reply("(messageOne)\nmessageTwo","messageThree") returns : 
(messageTwo) 
messageThree 
+0

¿Podría publicar un programa corto pero completo que demuestre el problema? Me resulta difícil reconstruir en este momento. –

Respuesta

54

Si especifica RegexOptions.Multiline, puede usar ^ y $ para que coincida con el inicio y el final de una línea, respectivamente.

Si no desea utilizar esta opción, recuerde que una nueva línea puede ser cualquiera de los siguientes: \n, \r, \r\n, así que en vez de mirar sólo para \n, tal vez debería usar algo como: [\n\r]+ , o más exactamente: (\n|\r|\r\n).

+17

No olvide que la alternancia no es codiciosa; si aplica su expresión regular a '" \ r \ n "' solo coincidirá con '" \ r "'. Yo usaría '(\ n | \ r \ n??) O quizás' (\ r \ n? | \ N) 'en su lugar. –

+0

No pude hacerlo funcionar con la opción Multiline. (\ n | \ r | \ r \ n) hizo el truco. Apareció que, en este caso particular, \ r \ n era necesario para obtener una coincidencia, aunque solo inserté \ n en la cadena que se va a emparejar. – Dabblernl

+0

@ AlanMoore gracias por eso. Estaba confundido por qué '\ r \ n' coincidía dos veces. – ToastyMallows

3

Si usted está tratando de igualar los finales de línea, puede que encuentre

Regex.Match("string", "regex", RegexOptions.Multiline) 

ayuda

+1

lo siento, eso no funciona – Dabblernl

4

usted está probablemente va a tener un \ r antes de tu \ n. Intente reemplazar el \ s con (\ r \ n).

15

Acctually que funciona, pero con la opción contraria es decir

RegexOptions.Singleline 

:-)

+1

¡agradable! ¡eso lo arregló para mí! de alguna manera, las terminaciones de línea no fueron ignoradas usando la opción de líneas múltiples. pero con una sola línea lo hizo! +1 – Yustme

+0

Gracias por esta sugerencia, la entrada de varias líneas se procesa muy bien en el modo 'Singleline' ... pero el comportamiento difiere y, a veces, ¡el comportamiento de 'Singleline' es lo que necesita! Sabía que mi entrada era multilínea, así que sin pensar realmente en ello configuré la opción 'Multiline' ... pero en este caso' .' (dot) no coincide con la nueva línea char (s) que era lo que realmente querido. Establecer en 'Singleline' corrigió este problema. '$' en esos casos coincide con el final de la cadena de entrada que también es conveniente. Así que la lección aprendida: ¡la entrada de varias líneas no siempre significa que se debe usar la opción 'Multiline'! – TCC

+0

No sé si esto es lo que el OP quería o no, ¡pero era lo que yo quería! Eso es buscar el texto para mi expresión regular y, de hecho, ignorar las alimentaciones de línea. Gracias. – glaucon

3

Creo que puede ser un poco tarde a la fiesta, pero todavía espero que esto ayude.

Necesitaba obtener varios tokens entre dos signos de hash.

Ejemplo I/P:

## token1 ##
## Token2 ##
## token3_a
token3_b
token3_C##

Esto parecía funcionar en mi caso:

var matches = Regex.Matches (mytext, "##(.*?)##", RegexOptions.Singleline);

por supuesto, es posible que desee reemplazar los signos de hash dobles en ambos extremos con sus propios caracteres.

HTH.

Cuestiones relacionadas