3

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

我正在尝试编写一个名为的函数,该函数parseRegExpression() 解析传递的属性并生成键/值对它适用于输入:

"iconType:plus;iconPosition:bottom;"

但它无法解析输入:

"type:'date';locale:'en-US';"

基本上这个-标志被忽略了。代码位于:

http://jsfiddle.net/visibleinvisibly/ZSS5G/

正则表达式键值对如下

/[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;    
4

5 回答 5

0

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

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标志,所以不需要 [AZ]。
  • -应该在开头或结尾。
于 2013-07-15T05:38:40.370 回答
0

有几个问题:

  • 字符类内部的A|表示文字|字符,而不是替代字符。
  • 字符类内部的A.表示文字.字符,因此无需对其进行转义。
  • A-作为字符类中的第一个或最后一个字符表示文字-字符,否则表示字符范围。
  • [a-zA-Z]使用不区分大小写的修饰符 ( ) 时无需使用i[a-z]足够。
  • 您的更改之间的唯一区别是最后一点。这可以通过将您的交替限制在不同的部分来显着简化。

这应该等同于您的原始模式:

/[a-z-]*\s*:\s*[a-z0-9'":_\/.-]*\s*(?:;|$)/gi
于 2013-07-15T05:38:56.760 回答
0

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

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));
于 2013-07-15T05:47:11.603 回答
0

在字符集原子内部[...],管道字符|只是一个常规字符,并不意味着“或”。

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

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

然而,正则表达式语法还允许您通过将字符放置在它不能具有特殊含义的位置来避免字符集原子中的反斜杠转义......例如,短划线-作为集合中的第一个或最后一个(它不能表示范围在那里)。

另请注意,如果您需要能够匹配作为值引用的字符串,包括反斜杠转义,则正则表达式更复杂,例如

'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"

匹配包含反斜杠转义的单引号或双引号字符串,含义是:

  • 单引号'
  • 零个或多个:
    • 除单引号'或反斜杠外的任何字符\
    • 由反斜杠\后跟任何字符组成的对
  • 单引号'

或者用双引号"代替。

请注意,这些组已用(?:...)而不是普通分隔(...)以避免捕获

于 2013-07-15T06:34:13.760 回答
0

它不匹配连字符,因为它解释|-|为从 开始|和结束的范围|。(我原以为这会被视为语法错误,但你有它。它在我尝试过的每种正则表达式风格中都一样。)

看看这个正则表达式:

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

正如其他响应者所建议的那样,我将其折叠为一个替代方案,删除了不需要的管道,并通过将连字符移到末尾来避开连字符。我还在开头和结尾都锚定了它。或者尽可能地锚定它,无论如何。我使用了前瞻来匹配尾随的分号,因此下一场比赛开始时它仍然存在。它远非万无一失,但只要输入格式正确,它就应该可以正常工作。

于 2013-07-15T06:48:02.227 回答