2013-07-02 50 views
2

我想验证一个值检查以下格式之一:..A , B.. , A..B正则表达式,提取物组

,并检索值:(null, A) , (B, null) , (A, B)

这是我的代码:

var regexRange = new RegExp("^([a-zA-Z0-9]+)\.\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\.\.([a-zA-Z0-9]+)$"); 

function getRangeValues(value) { 
    var from = null; 
    var to = null; 
    var matches = regexRange.exec(value); 
    if (matches !== null) { 
     if (matches[3] !== undefined) { 
      to = matches[3]; 
     } 
     else if(matches[1]!==undefined && matches[1]!=='') { 
      from = matches[1]; 
      if (matches[2] !== undefined && matches[2] !== '') { 
       to = matches[2]; 
      } 
     } 
    }  
    var range = { From: from, To: to }; 
    return range; 
} 

Value: 1233 => From=12, To=null 

我不明白为什么我得到这个不正确的行为,对于其他用例似乎工作。

+0

_“我不明白为什么我得到这个不正确的行为” _ - 哪个不正确的行为?你在说什么“1233”的输入? – nnnnnn

+0

是的,这就是我正在谈论的 – gigi

+0

使用反斜杠似乎确实有用。请给它一个答案。 – gigi

回答

1

我认为问题是,你没有逃脱反斜杠字符串文字,你从创建的正则表达式英寸字符串文字里面你需要\\.\\.如果你想要得到的正则表达式有\.\.

var regexRange = new RegExp("^([a-zA-Z0-9]+)\\.\\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\\.\\.([a-zA-Z0-9]+)$"); 

字符串中的单反斜线,如果他们后面没有需要转义字符被忽略,所以你正在创建一个正则表达式其中包含与任何两个字符匹配的..。使用更方便的文字正则表达式:

var regexRange = /^([a-zA-Z0-9]+)\.\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\.\.([a-zA-Z0-9]+)$/; 

(当然也有可能是其他问题,但我认为一个跳出)

+0

非常好的观察。谢谢。 – gigi

1

你能做到这样instead.You可以拆分输入,然后验证它

var output=value.split(".."); 
var from=output[0]; 
var to=output[1]; 
if(from.length>=1 || to.length>=1) 
{ 
if(from.search(/[^a-zA-Z0-9]/)==-1 && to.search(/[^a-zA-Z0-9]/)==-1)//valid 
else //invalid 
} 
else//invalid 
+0

虽然这不会验证字符串格式。 –

+0

@TimPietzcker oops..edited回答..感谢 – Anirudha

+1

“为什么使用正则表达式”,的确如此:) –

0

我觉得你这样事情就简单很多:

^([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$ 

会匹配所有三种情况下你提出并捕获正确组中的所有内容(如果存在)。但是,它也会匹配你可能不想要的..。所以,我们可以添加一个positive lookahead assertion,以确保至少一个alnum字符的情况下:

^(?=.*[a-zA-Z0-9])([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$ 

然后,你可以做

var myregexp = /^(?=.*[a-zA-Z0-9])([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$/; 
var match = myregexp.exec(subject); 
if (match != null) { 
    var from = match[1] 
    var to = match[2] 
} 
+0

感谢您的努力,但似乎并不奏效。我得到未定义,未定义的A,A ..,A..B – gigi

+0

@吉吉:你在我的代码中使用了文字正则表达式的构造函数吗,还是你把正则表达式粘贴到你的字符串中了? NNNNNN)? –

0

我相信你的正则表达式可以简化。考虑以下代码:

str='..A , B.. , A..B'; 
re = /(\w*)\.\.(\w*)/g; 
var arr = []; 
var match; 
while (match = re.exec(str)) 
    arr.push([ match[1]=="" ? null:match[1], match[2]=="" ? null:match[2] ]); 
console.log(arr); 
// OUTPUT: [[null, "A"], ["B", null], ["A", "B"]]