【问题标题】:Regex select specific characters between double quotes正则表达式选择双引号之间的特定字符
【发布时间】:2023-03-17 13:30:02
【问题描述】:

我想使用正则表达式提取位于引号 (") 之间的特定字符,即 ;


字符串示例:

Lorem;ipsum;"dolor;sit;";amet;


应该在引号中选择每个;

Lorem;ipsum;"dolor;sit;";amet;


我试过这个,但它不起作用

(?<=\")(;)*(?=\")

有什么想法吗? 提前谢谢你

【问题讨论】:

  • 你能保证在给定的字符串中(最多)会有一对引号吗?如果存在多于一对引号的可能性,则表达式将不再是“常规”模式,并且需要代码循环将字符串作为标记列表进行检查。
  • 是的,它是一个 .csv 文件,其中包含许多带引号的列。出于性能原因,我想避免循环
  • @Sufhal 请注意,正则表达式在其核心机制中也执行大量循环,您可能会通过多一个循环实现更好的优化,并且在代码质量方面也具有更好的可读性
  • 如果你有"test;test"test;test"怎么办

标签: javascript regex


【解决方案1】:

您必须分两步完成:

  1. 选择引号之间的每个部分:/"[^"]+"/gm
  2. 在这些匹配中,搜索;

您应该能够将String.prototype.replace 与给定的正则表达式一起使用并查找“;”在您的替换回调中。

这是一个演示:

function escapeCsvDelimiter(input) {
  return input.replace(/"[^"]+"/gm, (match) => match.replace(/;/g, '\\;'));
}

const test = 'Lorem;ipsum;"dolor;sit;";amet;"jhv;"';
const result = escapeCsvDelimiter(test);

console.log(result);

【讨论】:

  • 没有办法只用一个正则表达式吗?
  • 恕我直言不可靠
  • 我要运行这个服务器端
  • 这在这里无关紧要。如果您想大大提高性能,您可以预编译每个正则表达式。但作为一般规则,也要记住“过早的优化是万恶之源”
  • 此答案是您能够使用正则表达式执行此操作的唯一方法。 (没有合理的方法来避免循环。另一种方法,如果考虑性能可能更好,只需一个循环来检查每个字符,计算引号,并在引用计数为时记下 ; 字符奇数(在一对引号内)。
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 2019-08-04
  • 1970-01-01
  • 2019-11-25
  • 2014-03-20
相关资源
最近更新 更多