如何拆分白色空格而不是引号之间?

时间:2016-11-08 05:23:33

标签: javascript regex split

我正在尝试仅在白色空格(\s)上拆分字符串,但这不是在"引用"之间。部分。

我按照以下方式匹配这些引用部分之间的所有文本:

(['"`]).*?\1

Regex101

但是,当我尝试将其添加为否定前瞻时,只能在这些引号之外的空格上分割,我无法使其工作:

\s(?!(['"`]).*?\1)

Regex101

我怎样才能拆分不在"引号"的白色空格?

3 个答案:

答案 0 :(得分:7)

\s(?=(?:[^'"`]*(['"`])[^'"`]*\1)*[^'"`]*$)

您可以将此正则表达式与lookahead分开使用。请参阅演示。

https://regex101.com/r/5I209k/4

或混合蜱类型。

https://regex101.com/r/5I209k/7

答案 1 :(得分:2)

问题是您需要在组中排除条目。你可以这样做,而不是使用负向前瞻:

(\S*(?:(['"`]).*?\2)\S*)\s?|\s

基本上它的作用是:

  • 捕获任何非空白字符
    • 可能包含带引号的字符串
    • 并且可选地直接跟随任何非空格(例如引用后的逗号)。
  • 然后匹配可选的尾随空格

OR

  • 匹配单个空格

然后,捕获group1将包含所有非空白字符的尽可能长的序列(除非它们在引号内)。因此,这可以与替换组\1\n一起使用,用换行符替换您想要的空格。

Regex101:https://regex101.com/r/A4HswJ/1

JSFiddle:http://jsfiddle.net/u1kjudmg/1/

答案 2 :(得分:1)

我使用更简单的方法,不需要高级功能:

'[^']*'|"[^"]*"|`[^`]*`|\S*

含义:

  • 单引号部分'[^']*'
  • |双引号部分"[^"]*"
  • |后面引用的部分(无法将其内嵌在SO标记中)
  • |未引用的部分\S+

这将分开引用的部分。如果不需要,您可以使用

("[^"]*"|'[^']*'|`[^`]*`|\S)+

即。查找令牌序列,其中每个令牌都是非空格或带引号的部分。