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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top