Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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中分析正则表达式中的-in_Javascript_Regex - Fatal编程技术网

无法在Javascript中分析正则表达式中的-in

无法在Javascript中分析正则表达式中的-in,javascript,regex,Javascript,Regex,我对Javascript中的正则表达式有点陌生 我正在尝试编写一个名为parseRegExpression() 它解析传递的属性并生成键/值对 它可以很好地处理输入: "iconType:plus;iconPosition:bottom;" 但它无法解析输入: "type:'date';locale:'en-US';" 基本上,-符号被忽略。代码位于: 正则表达式键值对如下所示 /[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*;|[

我对Javascript中的正则表达式有点陌生

我正在尝试编写一个名为
parseRegExpression()
它解析传递的属性并生成键/值对 它可以很好地处理输入:

"iconType:plus;iconPosition:bottom;"
但它无法解析输入:

"type:'date';locale:'en-US';"
基本上,
-
符号被忽略。代码位于:

正则表达式键值对如下所示

/[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*;|[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*$/gi;    

替换代码中的正则表达式,如下所示:

regExpKeyValuePair = /[-a-z]*\s*:\s*[-a-z'":_\/.0-9]*\s*;|[-a-z]*\s*:\s*[-a-z'":-_\/.0-9]*\s*$/gi;              
regExpKey = /[-a-z]*/gi;
regExpValue = /[-a-z:_\/.0-9]*/gi;
  • 你不需要逃跑。内部
    []
  • 无需将
    |
    放在元素之间
    []
  • 因为您使用的是
    /i
    标志,所以不需要[A-Z]
  • -
    应该在开头或结尾

    • 有几个问题:

      • 字符类中的
        表示文字
        字符,而不是替代字符
      • 字符类中的
        表示文字
        字符,因此无需转义它
      • 字符类中作为第一个或最后一个字符的
        -
        表示文字
        -
        字符,否则表示字符范围
      • 使用不区分大小写的修饰符(
        i
        )时,无需使用
        [a-zA-Z]
        <代码>[a-z]就足够了
      • 你改变的唯一区别是最后一点;这可以通过将你的选择限制在不同的部分而大大简化
      这应该与您的原始模式相同:

      /[a-z-]*\s*:\s*[a-z0-9'":_\/.-]*\s*(?:;|$)/gi
      

      您可以避免使用正则表达式:

      var test1 = "iconType:plus;iconPosition:bottom;";
      var test2 = "type:'date';locale:'en-US';";
      
      function toto(str) {
          var result = new Array();
          var temp = str.split(';');
          for (i=0; i<temp.length-1; i++) {
              result[i] = temp[i].split(':',1);
          }
          return result;
      }
      
      console.log(toto(test1));
      console.log(toto(test2));
      
      var test1=“iconType:plus;iconPosition:bottom;”; var test2=“类型:'date';区域设置:'en-US';”; 函数toto(str){ var result=新数组(); var temp=str.split(“;”);
      对于(i=0;i在字符集atom
      […]
      中,管道字符
      |
      只是一个常规字符,并不表示“或”

      字符集原子列出要接受的字符或范围(如果字符集以
      ^
      开头,则列出或排除),并且“或”是隐式的

      如果需要包括/排除右括号
      ]
      符号、
      ^
      符号、用于范围的破折号
      -
      、反斜杠
      \
      本身、不可打印字符,或者如果要使用非ASCII unicode字符指定代码而不是字面上的字符,则可以在字符集中使用反斜杠

      但是,正则表达式语法还允许您通过将字符放置在不能具有特殊含义的位置来避免字符集原子中的反斜杠转义…例如,破折号
      -
      作为集合中的第一个或最后一个(它不能表示其中的范围)

      另外请注意,如果需要能够匹配带引号的字符串(包括反斜杠转义),则正则表达式更复杂,例如

      '(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"
      
      匹配单引号或双引号字符串,包括反斜杠转义,意思是:

      • 单引号
      • 零个或多个:
        • 除了单引号
          或反斜杠
          \
        • 由反斜杠
          \
          后跟任意字符组成的一对字符
      • 单引号
      或者用双引号
      代替


      请注意,这些组是用
      (?:…)
      而不是普通的
      (…)
      分隔的,以避免捕获它不匹配连字符,因为它将
      -
      解释为从
      开始到
      结束的范围。(我本以为这会被视为语法错误,但现在你看到了。在我尝试过的每种正则表达式风格中,它都是一样的。)

      看看这个正则表达式:

      /(?:^|;)([a-z-]*)\s*:\s*([a-z'":_\/.0-9-]*)\s*(?=;|$)/ig
      

      正如其他响应者所建议的,我将其折叠为一个备选方案,删除了不需要的管道,并通过将其移动到末尾来避开连字符。我还将其锚定在开头和结尾。或者尽我所能锚定它。我使用了前瞻来匹配尾随分号,以便下次匹配时它仍在那里开始。它远不是万无一失的,但只要输入格式正确,它就可以正常工作。

      您不需要
      |
      中的
      []
      字符充当“或”"如果键或值需要能够包含
      ,则此解决方案不起作用。我不相信键可以包含
      ,但对于值,我使用了拆分函数的限制参数。使用此简化方法,值不能包含
      尝试,祈祷和希望?这是为您编写的程序吗?@6502,我自己试过了。对不起,我的英语不好。
      try
      不是一个合适的词吗?对不起,也许我反应过度了。但编程至少在谈论正确性时是(或应该)像数学一样的。“try”(“看看会发生什么”)建议编程是不可预测的,而学习这种编程方式确实会让代码变得不可预测。在某些地方,尝试和查看是唯一可行的解决方案(例如,性能,特别是在微调领域),但这不是其中之一。@6502,您的解释听起来很合理。谢谢。