Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 引号外特定字符上的正则表达式拆分字符串_Javascript_Regex - Fatal编程技术网

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);