Pergunta
Como posso substituir solitário ocorrências de (LF sozinho com CRLF), usando uma expressão regular em C#?
Desculpe se for uma pergunta idiota, eu sou novo para Regex.
Eu sei fazê-lo usando o plano de String.Replace
, como:
myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");
No entanto, isso é deselegante, e destruiria qualquer " " já no texto (embora eles provavelmente não existe).
Solução
Isto vai fazer?
[^\r]\n
Basicamente, ele corresponde a um ' ' que é precedido por um caractere que não é ' '.
Se você deseja detectar linhas que começam com um simples ' ', bem como, em seguida, tentar
([^\r]|$)\n
Que diz que ele deve corresponder um ' ', mas apenas aqueles que é o primeiro caractere de uma linha ou aqueles que são não precedido por ' '
Pode haver casos especiais, para verificar como você está brincando com a definição de linhas em si o '$' pode não funcionar muito bem.Mas eu acho que você deve ter uma idéia.
EDITAR: crédito @Kibbee Usando look-ahead s é claramente melhor, pois não captura a correspondência anterior caracteres e deve ajudar com qualquer borda de casos bem.Então aqui está um melhor regex + o código torna-se:
myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
Outras dicas
Pode ser mais rápido se você usar esse.
(?<!\r)\n
Basicamente, ele procura por , que não é precedido por uma .Esta seria mais provável ser mais rápido, porque no outro caso, quase que a cada letra corresponde a [^ ], então ele iria capturar e, em seguida, procure a pasta depois.No exemplo que eu dei, ele só iria parar quando ele encontrou um , e olhar antes de que para ver se ele encontrou
Eu estava tentando fazer o código abaixo para uma seqüência de caracteres, e ele não estava trabalhando.
myStr.Replace("(?<!\r)\n", "\r\n")
Eu usei Regex.Substituir e funcionou
Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
Acho que o "myStr" é um objeto do tipo String, no caso, esta não é regex. são os equivalentes para CR e LF.
Meu melhor palpite é que, se você sabe que você tem um para CADA linha, não importa o que, você primeiro deve excluir todos .Em seguida, substitua todas as .
A resposta chakrit dá-gostaria de ir também, mas, em seguida, você precisa usar regex, mas desde que você não diz que "myStr" é...
Edit:olhando para os outros exemplos, me diz uma coisa..por que fazer as coisas difíceis, quando você pode fazê-lo fácil?, Porque não há regex, não é o mesmo que "deve-se usar" :D
Edit2:Uma ferramenta muito valiosa quando mexer com regex, xpath, e outros enfeites que lhe dá resultados estranhos, posso apontar-lhe: http://www.regexbuddy.com/
myStr.Replace("([^\r])\n", "$1\r\n");
$ precise ser um \
Tente isso:Replace(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13) o)
Se eu sei que as terminações de linha deve ser um dos CRLF ou LF, algo que funciona para mim é
myStr.Replace("\r?\n", "\r\n");
Isso, essencialmente, faz o mesmo neslekkiM's resposta, exceto ele realiza apenas uma operação de substituir a seqüência de caracteres em vez de dois.Este também é compatível com Regex motores que não suportam negativo lookbehinds ou backreferences.