首页 > 解决方案 > 当文本被引号包围时,Javascript 正则表达式用新行拆分字符串

问题描述

我想在split引用文本时使用字符串方法来拆分字符串。例如,我想要这个字符串:

Some text  

"This is what
I want to catch"

Some more text

变成一个字符串数组如:

0: "Some text"
1: "This is what↵I want to catch"
2: "↵↵Some more text"

为此,我呼吁:

inputText.split(/"((.+)|\s)+"/)

这不起作用,因为它创建了数组:

0: "Some text"
1: "I want to catch"
2: "I want to catch"
3: "↵↵Some more text"

知道如何实现我想要的吗?

我不能使用后视和前瞻,因为我仍然希望引号成为匹配的一部分。我的目标是在文本被引号包围时拆分字符串,但数组中没有引号本身。

标签: javascriptregex

解决方案


根据需要,您可以在以下位置使用此正则表达式split

/\n*(?:"([^"\\]*(?:\\.[^"\\]*)*)")?\n+/

正则表达式解释:

  • \n*: 匹配 0+ 换行符
  • (?::启动非捕获组
    • ": 比赛开场"
    • (: 开始捕获组
      • [^"\\]*: 匹配 0+ 的任何非"和非字符\
      • (?:\\.[^"\\]*)*: 匹配一个转义字符,后跟 0+ 的任何非"和非字符\。重复此组 0 次或多次
    • ): 结束捕获组 #1
    • ": 比赛结束"
  • )?:结束非捕获组。?使该组可选
  • \n+: 匹配 1+ 换行符

代码:

const s = `Some text

"This is what
I want to catch"

Some more text`

var m = s.split(/\n*(?:"([^"\\]*(?:\\.[^"\\]*)*)")?\n+/)

console.log(m)


或者,您可以在 Javascript 中使用此正则表达式来匹配带引号的字符串,该字符串也允许转义引号:

/"[^"\\]*(?:\\.[^"\\]*)*"|[^"\n]+/g

正则表达式演示

正则表达式解释:

  • ": 比赛开场"
  • [^"\\]*: 匹配 0+ 的任何非"和非字符\
  • (?:\\.[^"\\]*)*: 匹配一个转义字符,后跟 0+ 的任何非"和非字符\。重复此组 0 次或多次
  • ": 比赛结束"
  • |: 或者
  • [^"\n]: 匹配没有换行符的其他行或"

代码:

const s = `Some text

"This is what
I want to catch"

Some more text`

var m = s.match(/"[^"\\]*(?:\\.[^"\\]*)*"|[^"\n]+/g)

console.log(m)


推荐阅读