【问题标题】:Regex replace enters between quotes正则表达式替换在引号之间输入
【发布时间】:2016-06-07 09:13:59
【问题描述】:

如何替换文本文件中两个引号之间的所有输入。第一个引号总是以制表符开头,或者它是行中的第一个字符(csv 文件)。我尝试了以下正则表达式

/(\t"|^")([^"]*)(\n)([^"]*")/gm

但是这个正则表达式只匹配两个引号之间的第一个输入,而不是全部。

例如以下文字:

xx "xx 
xx 
xx" 
xx 
"xx"
xx 
xx
"xxx xxx 
xx"

应该变成

xx "xx xx xx" 
xx 
"xx"
xx 
xx
"xxx xxx xx"

我阅读了以下帖子( javascript regex replace spaces between brackets )非常相似,但正则表达式建议在我的情况下不可用。

【问题讨论】:

  • 这是什么语言? Javascript?此外,如果您有 CSV 文件,请使用 CSV 解析器。
  • 一个正则表达式来处理它可能会变得非常丑陋和缓慢。考虑一种多通道方法: 1. 提取所有引用的文本; 2. 替换引用文本中的all \n; 3. 用更正的引用部分重新组装未引用的部分。
  • @Tomalak 我更新了问题,javascript 很好。我正在使用 csv 解析器,但由于在错误的位置输入,此解析器给出错误。
  • 然后使用更好的解析器。例如,papaparse.com 可以很好地处理引用值和值中的换行符。不要为此使用正则表达式。

标签: javascript regex


【解决方案1】:

用 Javascript 替换你可以use a function as replacement

var str = 'foo \n"a\n" bar\n';

str = str.replace(/"[^"]+"/g, function(m) {
 return m.replace(/\n/g, ' ');
});

console.log(str);

正则表达式 "[^"]+" 将匹配引用的内容,其中包含一个或多个 non-quotes。

根据需要在模式中添加制表符或开始等条件:(?:\t|^)"[^"]+"

【讨论】:

  • 这种方法与 Abbondanza 的建议非常相似。这个想法很有趣,唯一的缺点是处理引号之间的所有数据(引号之间的文本也没有输入)。有什么办法解决这个问题?
  • @Nebu 您可以修改模式以在引号内至少需要一个换行符\n,如下所示:(?:\t|^)"[^"\n]*\n[^"]+"(还需要^ start 或\t 之前)。您需要测试这是否会大大加快您的输入速度。
【解决方案2】:
\n(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)

您可以使用它并替换为empty string

See Demo

var re = /\n(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)/g; 
var str = 'xx "xx \nxx \nxx" \nxx \n"xx"\nxx \nxx\n"xxx xxx \nxx"';
var subst = ''; 

var result = str.replace(re, subst);

【讨论】:

  • 这适用于小文件。不幸的是,我的文本文件相当大(50000+ 行)。对于这些文件,这个正则表达式需要很多步骤。
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多