2009-07-23 18 views
24

OK, questo mi sta facendo impazzire .... ho una stringa che si forma in tal modo:Regex che corrisponde a una nuova riga ( n) in C#

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

newContent mostrerà come:
(testo precedente)
nuovo testo

Ho bisogno di un'espressione regolare che rimuove il testo tra parentesi con la parentesi inclusa E il carattere di nuova riga.

Il meglio che posso venire in mente è:

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

Questo funziona, ma voglio specificamente per essere abbinato alla nuova riga (\n), non qualsiasi spazio bianco (\s) Sostituzione \s con \n\\n o \\\n fa Non funziona.

Per favore aiutami a mantenere il mio equilibrio mentale!

EDIT: un esempio:

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

Potresti pubblicare un programma breve ma completo che mostri il problema? Sto trovando difficile da mettere insieme al momento. –

risposta

54

Se si specifica RegexOptions.Multiline, è possibile utilizzare ^ e $ rispettivamente per l'inizio e la fine di una riga.

Se non si desidera utilizzare questa opzione, ricorda che una nuova linea può essere uno qualsiasi dei seguenti: \n, \r, \r\n, così invece di guardare solo per \n, si dovrebbe forse usare qualcosa come: [\n\r]+ o più esattamente: (\n|\r|\r\n).

+17

Non dimenticare che l'alternanza non è avara; se applichi la tua regex a "" \ r \ n "' corrisponderà solo a '" \ r "'. Vorrei usare '(\ n | \ r \ n?)' O forse '(\ r \ n? | \ N)' invece. –

+0

Non riuscivo a farlo funzionare con l'opzione Multiline. (\ n | \ r | \ r \ n) ha fatto il trucco. È emerso che in questo caso particolare \ r \ n era necessario ottenere una corrispondenza, anche se ho inserito solo \ n nella stringa da abbinare. – Dabblernl

+0

@AlanMoore grazie per quello. Ero confuso perché "\ r \ n" corrispondesse due volte. – ToastyMallows

3

Se stai cercando di abbinare la fine della riga, si potrebbe essere

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

aiuta

+1

scusa, non funziona – Dabblernl

4

Probabilmente si sta andando ad avere un \ r prima del tuo \ n. Prova a sostituire \ s con (\ r \ n).

15

Acctually funziona, ma con l'opzione opposta cioè

RegexOptions.Singleline 

:-)

+1

bello! quello lo ha riparato per me! in qualche modo, le terminazioni di riga sono state ignorate usando l'opzione multilinea. ma con una sola riga lo ha fatto! +1 – Yustme

+0

Grazie per questo suggerimento, l'input multi-linea viene elaborato correttamente nella modalità 'Singleline' ... ma il comportamento è diverso e talvolta il comportamento di' Singleline' è quello che ti serve! sapevo che il mio input era multi-line, quindi senza pensarci veramente ho impostato l'opzione 'Multiline' ... ma in questo caso' .' (punto) non corrisponde al carattere di nuova riga che era quello che realmente ricercato. L'impostazione su 'Singleline' risolve questo problema. '$' in quei casi corrisponde alla fine della stringa di input che è anche conveniente. Quindi, lezione appresa: l'input multi-linea non sempre significa che l'opzione 'Multiline' dovrebbe essere usata! – TCC

+0

Non so se questo è ciò che l'OP voleva o no ma era quello che volevo! Vale a cercare il testo per la mia espressione regolare e, in effetti, ignorare i feed di riga. Grazie. – glaucon

3

che potrei essere un po 'in ritardo alla festa, ma spero ancora che questo aiuta.

Avevo bisogno di ottenere più token tra due cancelletti.

Esempio I/P:

## token1 ##
## token2 ##
## token3_a
token3_b
token3_C##

Questo sembrava funzionare nel mio caso:

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

Ovviamente, è possibile sostituire i segni di hash doppio alle due estremità con i propri caratteri.

HTH.

Problemi correlati