javascript - 查找和替换双引号之间的换行符

标签 javascript regex csv search-regex

我有一个 CSV 文件,其中包含一些值换行符。例如:

"Chiffre","Nom","Descriptif court","Tarifs en clair","Période en clair","Adresse 1","CP","Tel","Site","Facebook","Pictos","@Saveurs","@Famille plus","@Img","Accessible en fauteuil roulant en autonomie","Handicapes","Terrasse","Wifi","Chèque Vacances","Titre Restaurant"
6,"Le Chalet d'en Ô","Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.","Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.","Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.","Le Cropt - Route de Serraval","74230 Les Clefs","+33 4 50 02 09 00","www.lechaletdeno.com",,"A R J X x",,,,,"A","R","J","X","x"
7,"La Cabane - Pisciculture de Montremont","Bar - restaurant au bord de la rivière dans un cadre champêtre avec sa spécialité la truite.","Menu adulte : de 26 à 35 €.","Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.","Pisciculture de Montremont - 100 impasse des Pesetz","74230 Thônes","+33 4 50 02 00 85","pisciculture-montremont.fr",,"A R  X x",,,,,"A","R",,"X","x"

只需要用空格(或任何东西)替换任何换行符。

尝试了很多现有的解决方案,但使用\\n由于搜索词似乎不起作用,还有其他问题。

有什么想法吗?谢谢。

Sublime Text 就足够了,但如果其他工具更简单,没问题。

编辑:\n如果我只有这个作为搜索词,效果很好。但我只需要在 " 之间找到它们.到目前为止,我得到的最好结果是匹配 " 之间的所有文本。与:(?<=")[^"]* .

最佳答案

您不能以安全的方式使用文本编辑器执行此操作,因为开始和结束分隔符是相同的,并且任何基于环视的解决方案或基于 \G 的解决方案都不会很好地工作。

使用一些支持回调方法/函数的编程语言作为正则表达式替换方法/函数中的替换参数,匹配任何双引号子字符串

"[^"]*(?:""[^"]*)*"

参见 regex demo .如果您不需要关心文字双引号,则简化版本是 "[^"]+"

详情

  • " - 双引号
  • [^"]* - 除双引号外的 0+ 个字符
  • (?: - 重复 0 次以上的分组构造
    • "" - 2 个双引号
    • [^"]* - 除双引号外的 0+ 个字符
  • )* -
  • " - 双引号。

这个正则表达式可以按如下方式使用:读入一个文件并使用以下解决方案:

  • : re.sub(r'"[^"]*(?:""[^"]*)*"', lambda m: m.group(0).replace("\n", ""), s)
  • : s = s.replace(/"[^"]*(?:""[^"]*)*"/g, function(m) { return m.replace(/\n/g, ' '); })
  • : $s = preg_replace_callback('~"[^"]*(?:""[^"]*)*"~', function($m) { return str_replace("\n", "", $m[0]); }, $s)
  • : s = Regex.Replace(s, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\n", ""))

如果您有 \r\n 要删除,作为第二步,您可以使用 .replace(/[\r\n]+/g, '') 在 JS 中,preg_replace('~\R+~', '', $m[0]) 在 PHP 中,m.Value.Replace( "\r", "").Replace("\n","") 在 C# 和 m.group(0).replace("\n", "").replace("\n", "") 在 Python 中。

在 C# 中,完整的解决方案如下所示

using System.IO;
...
var file = "path_to_file";
var path_to_save = "path_to_save";
var contents = string.Empty;
using (var sr = new StreamReader(file, true)) // true for a Unicode encoding
{
    contents = sr.ReadToEnd();
}
contents = Regex.Replace(contents, "\"[^\"]*(?:\"\"[^\"]*)*\"", 
    m => m.Value.Replace("\n", "").Replace("\r", ""));
using (var sw = new StreamWriter(path_to_save, false, Encoding.UTF8))
{
    sw.Write(contents);
    sw.Close();
}

关于javascript - 查找和替换双引号之间的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47797207/

相关文章:

Javascript Object.defineProperty 设置属性更改时触发的方法

javascript - 在用户提交表单之前,如何检查文本框和复选框是否已填写并选中?

asp.net - 正则表达式大于和小于

javascript - 正则表达式匹配句子中的字符串

php - 需要使用 str_replace 或任何其他方式翻译字符串中的单词

Delphi 7 将 XLS(X) 转换为 CSV

php - 如何获取 WordPress 查询受影响的行数?

javascript - Discord.js (v13) SlashCommandBuilder addIntegerOption 设置范围

javascript随机选择变量

c# - Err_Response_Headers_Multiple_Content_Disposition