2013-07-15 14 views
3

我对Javascript中的正则表达式有点新鲜。无法解析 - 用Javascript正则表达式

我试图写一个函数调用parseRegExpression() 其解析传递的属性,并生成一个键/值对 它正常工作与输入:

"iconType:plus;iconPosition:bottom;" 

但它不能解析输入:

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

基本上-符号被忽略。该代码是:

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

正则表达式的key值对如下

/[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;  
+1

您不需要'[]'里面的'|'字符充当“或” – Ian

回答

0

有几个问题:

  • 一个|字符类中是指文字|字符,而不是一个交替。
  • A .里面的一个字符类意味着一个文字.字符,所以没有必要转义它。
  • A -作为字符类中的第一个或最后一个字符表示文字-字符,否则它表示字符范围。
  • 当您使用不区分大小写的修饰符(i)时,不需要使用[a-zA-Z]; [a-z]就够了。
  • 您的修改之间唯一的区别是最后一点;这可以通过将您的替代限制在不同的部分来显着简化。

这应该是等同于原来的模式:

/[a-z-]*\s*:\s*[a-z0-9'":_\/.-]*\s*(?:;|$)/gi 
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]。
  • -应该在开始或结束。
+0

尝试,祈祷和希望?这是为你编程吗? – 6502

+0

@ 6502,我自己试了一下。对不起。我不擅长英语。 “尝试”不是一个合适的词吗? – falsetru

+0

对不起,可能我反应过度了。但至少在谈论正确性时,编程至少(或应该)像数学一样。 “try”(“看看会发生什么”)这个词表明编程是不可预测的,学习编程的方式的确会让你的代码变得不可预测。有些地方尝试看到的是唯一实用的解决方案(例如性能,特别是在微调领域),但这不是其中之一。 – 6502

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

如果密钥或值需要能够包含':',则此解决方案不起作用。 – 6502

+0

我不认为键可以包含':',但是对于该值,我已经使用了split函数的limit参数。 –

+0

使用这种简化的方法,该值不能包含';' – 6502

0

在字符集原子[...]管焦炭|只是一个普通的字符并不意味着“或”。

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

你可以,如果你需要包括设置一个字符用一个反斜杠/排除闭括号]^标志,即用于范围破折号-,反斜杠\本身,不可打印的字符,或者如果你想使用指定代码的非ASCII Unicode字符而不是逐字地。

然而,正则表达式的语法也可以让你避免在字符集原子中的反斜杠转义,方法是将字符放在一个不能有特殊含义的位置......例如破折号-作为集合中的第一个或最后一个(它不能代表那里的范围)。

还要注意的是,如果你需要能够匹配的值引号的字符串,包括反斜杠,正则表达式是比较复杂的,例如

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

一个单引号或双引号字符串匹配包括反斜杠的含义之中:

  • 单引号'
  • 零个或多个的任:
    • 除了单引号'或反斜杠任何炭\
    • 一对随后的任何焦炭
  • 单引号'

或用双引号"相同反斜杠\组成代替。

注意的是,集团已分隔的(?:...)而不是纯(...)避免捕获

0

,因为它解释|-|为开始于||结束的范围不匹配连字符。 (我本来期望的是被视为一个语法错误,但你有它它工作在每一个正则表达式的味道,我已经试过了一样,太。)

看一看这个表达式:

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

正如其他响应者所建议的那样,我将它折叠为一个替代方案,移除不需要的管道,并通过将连接符移动到最后逃脱。我还将它在开始和结束时都加以锚定。无论如何,或者我可以将它锚定。我使用了前瞻来匹配尾部的分号,所以在下一场比赛开始时它仍然会在那里。这远非万无一失,但只要投入结构合理,它应该可以正常工作。