Javascript 引号外特定字符上的正则表达式拆分字符串
如何在保留带引号的字符串的同时拆分此行Javascript 引号外特定字符上的正则表达式拆分字符串,javascript,regex,Javascript,Regex,如何在保留带引号的字符串的同时拆分此行 >div#a.more.style.ui[url=“in.tray”]{value} 拆分的字符在哪里 #[{ 产生: >div #a .more .style .ui [url="in.tray"] {value} 目前的努力是: \>|\[|\{|#|\.?(?:(["'])(?:\\?.)*?\1)* 将“收件箱”拆分在一起 更新1: 解决方案需要基于regex,因为模式是从现有代码中JS对象的键组装而成的,这些键是: JSObjec
>div#a.more.style.ui[url=“in.tray”]{value}
拆分的字符在哪里
#
[
{
产生:
>div
#a
.more
.style
.ui
[url="in.tray"]
{value}
目前的努力是:
\>|\[|\{|#|\.?(?:(["'])(?:\\?.)*?\1)*
将“收件箱”
拆分在一起
更新1:
解决方案需要基于regex,因为模式是从现有代码中JS对象的键组装而成的,这些键是:
JSObject
'>': function ...
'^': function ...
'[': function ...
...
函数用作回调以处理正则表达式的输出
目标字符串是一个Emmet宏,可能包含要开始的纯字符,以及可能重复的至少^
,$
,将被视为单独的元素,例如:
p>div>div>span^h2^^h1>div#a.li^mo+re.st*yle.ui[url=“in.tray”]{value}$$$$
当前工作基于使用.match()
但筛选出的最后一个匹配项为空:
[a-z$^+*>#.[]{0,1}(?“[^”]*“|[^”$^+*>#.[]{0,}
很难找到只使用一个正则表达式的解决方案
我可以提出以下建议:
var i=0, s= '>div#a.more.style.ui[url="in.tray"]{value}';
var tokens = s.replace(/("[^"]+"|[^"\s]+)/g, function(v){
return (i++)%2 ? v : v.replace(/([.>#\[{])/g, '@@@$1')}
).split('@@@').filter(Boolean);
(将@@@@code>替换为您知道不在字符串中的字符串
我们的想法是
将初始字符串拆分为带引号的字符串和带引号的字符串(或者,后面的字符串加引号)(不是真正的拆分,只是概念上的拆分)
在引号之外,在分隔符之前添加@@@@
在连接的字符串上拆分@@
使用filter
我想知道在这种情况下,正则表达式是否真的是一种方法。我知道它被标记为Regex
,但我想分享一个非正则表达式解决方案,它只处理每个字符:
var string = '>div#a.more.style.ui[url="in.tray"]{value}'
var delims = [ '>', '#', '.', '[', '{' ];
var inQuotes = false;
var parts = [];
var part = string[0]; // Start with first character
for(i = 1; i < string.length; i++) {
var character = string[i];
if(character == '"') inQuotes = !inQuotes;
if(!inQuotes && delims.indexOf(character) > -1) {
parts.push(part);
part = character;
} else part += character;
if(i == string.length-1) parts.push(part);
}
console.log(parts);
inQuotes
业务对于引号内的转义引号不起作用,例如,“他说,\“您好!\”
,但对于这样的简单情况,它会起作用。您可以扩展它,通过将前面的字符与“\”进行比较来检查引号内的转义引号是否有效我想检查一下,isQuotes
当前是否为true
,但可能有更好的解决方案
就可读性而言,我认为这样的方法比正则表达式更可取。不要使用split()
,那么很容易:
result = subject.match(/[>#.[{](?:"[^"]*"|[^">#.[{])+/g);
看到了
说明:
[>#.[{]#匹配一个“拆分”字符
(?:#组的开头与以下任一项匹配。。。
“[^”]*”#带引号的字符串
|#或
[^”>#.[{]#除引号和“拆分”字符外的任何字符
)+#至少重复一次。
你能解释一下你的代码吗?这对像你这样的新手来说非常有帮助us@aelor我编辑来解释这个想法。这更清楚吗?嗨,我只是想知道你是否键入“在regex101.com上观看直播”或者你有代码来生成链接?因为它看起来总是一样的same@aelor:我使用包含静态文本的快捷方式并自动将相关URL插入其中。@dystroy:嗯,更多是出于习惯-如果我不需要重用子组匹配,那么我使用非捕获组。在这种情况下,甚至可能有相关的性能e好处,因为捕获组会捕获很多子匹配,然后立即丢弃它们。但我没有测量它。+1的可读性注释,而不仅仅是抛出regex
,在这个问题上,代码需要它-请参阅更新1。
result = subject.match(/[>#.[{](?:"[^"]*"|[^">#.[{])+/g);