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

时间:2013-07-15 05:32:03

标签: javascript regex

我对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;    

5 个答案:

答案 0 :(得分: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标志,所以不需要[A-Z]。
  • -应位于开头或结尾。

答案 1 :(得分:0)

有一些问题:

  • 字符类中的|表示文字|字符,而不是替换。
  • 字符类中的.表示文字.字符,因此无需转义它。
  • 作为字符类中第一个或最后一个字符的-表示文字-字符,否则表示字符范围。
  • 使用不区分大小写的修饰符([a-zA-Z])时,无需使用i; [a-z]就够了。
  • 你改变的唯一区别是最后一点;只需将您的交替限制在不同的部分,就可以大大简化这一点。

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

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

答案 2 :(得分: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));

答案 3 :(得分:0)

在字符集atom [...]内部,管道字符|只是一个常规字符,并不代表“或”。

字符集atom列出要接受的字符或范围(如果字符集以^开头,则排除)和“或”是隐含的。

如果您需要包含/排除近距离]^符号,用于范围的短划线-,则可以在字符集中使用反斜杠反斜杠\本身,一个不可打印的字符,或者如果你想使用非ASCII unicode char指定代码而不是字面意思。

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

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

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

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

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

或相同的双引号"

请注意,这些组已使用(?:...)而非(...)分隔,以避免捕获

答案 4 :(得分:0)

它与连字符不匹配,因为它将|-|解释为从|开始到|结束的范围。 (我本来希望将其视为语法错误,但是你有它。它在我尝试过的每一种正则表达式中都起作用。)

看看这个正则表达式:

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

正如其他响应者所建议的那样,我把它折叠成一个替代方案,删除了不需要的管道,并通过将连字符移动到最后来逃脱连字符。我也在开始和结束时都把它固定下来。无论如何,或者尽我所能地锚定它。我使用前瞻来匹配尾随的分号,所以当下一场比赛开始时它仍然存在。它远非万无一失,但只要输入结构良好,它就可以正常工作。