我正在尝试仅在白色空格(\s
)上拆分字符串,但这不是在"引用"之间。部分。
我按照以下方式匹配这些引用部分之间的所有文本:
(['"`]).*?\1
但是,当我尝试将其添加为否定前瞻时,只能在这些引号之外的空格上分割,我无法使其工作:
\s(?!(['"`]).*?\1)
我怎样才能拆分不在"引号"的白色空格?
答案 0 :(得分:7)
\s(?=(?:[^'"`]*(['"`])[^'"`]*\1)*[^'"`]*$)
您可以将此正则表达式与lookahead
分开使用。请参阅演示。
https://regex101.com/r/5I209k/4
或混合蜱类型。
答案 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)+
即。查找令牌序列,其中每个令牌都是非空格或带引号的部分。