【问题标题】:A RegEx to split by semicolon outside single or double quotes一个正则表达式,在单引号或双引号之外用分号分隔
【发布时间】:2021-04-29 17:12:28
【问题描述】:

我需要一个 JavaScript 正则表达式来用分号在 singledouble 引号之外分割字符串。

实际上我正在使用以下正则表达式/(?!\B['"][^'"]*);(?![^'"]*['"]\B)/gm,遗憾的是它并没有涵盖所有情况。

我需要什么:

const string = `Lorem ipsum; "dolor sit; amet"; consectetur 'adipiscing; elit.' Fusce; sit amet ligula.; Phasellus in laoreet quam.`;

const resultArr = string.split(/THEREGEX/gm);

console.log(resultArr);
// ["Lorem ipsum", "\"dolor sit; amet\"", " consectetur 'adipiscing; elit.' Fusce", "sit amet ligula.", " Phasellus in laoreet quam."]

【问题讨论】:

标签: javascript regex


【解决方案1】:

你可以使用这个正则表达式:

((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;

RegEx Demo

代码:

const s = `Lorem ipsum; "dolor sit; amet"; consectetur 'adipiscing; elit.' Fusce; sit amet ligula.; Phasellus in laoreet quam.`
const re = /((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;/

console.log( s.split(re).filter(Boolean) )

正则表达式详细信息:

  • (: 开始捕获组 #1
    • [^;'"]*:匹配 0 个或多个不是 '" 且不是 ; 的字符
    • (?:: 启动非捕获组
      • "(?:\\.|[^"])*":匹配双引号子字符串,忽略所有转义引号
      • |:或者
      • '(?:\\.|[^'])*':匹配单引号子字符串,忽略所有转义引号
    • ): 结束非捕获组
    • [^;'"]*:匹配 0 个或多个不是 '" 且不是 ; 的字符
  • ): 结束捕获组 #1
  • |:或者
  • ;:匹配一个;
  • .filter(Boolean): 用于从拆分数组中删除空结果

【讨论】:

  • 这个正则表达式不能正常工作,即使没有分号也会拆分字符串。一个例子是这个字符串:SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'elements' ORDER BY ORDINAL_POSITION ASC。在TABLE_NAME = 之后剪切。
  • 伟大的模式++
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多