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

我不明白为什么我会得到这种不正确的行为,对于其他用例它似乎有效。

4

4 回答 4

1

你可以这样做。你可以拆分输入然后验证它

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
于 2013-07-02T14:05:24.743 回答
1

我相信您的正则表达式可以简化。考虑这段代码:

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"]]
于 2013-07-02T14:22:55.447 回答
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]+)$/;

(当然可能还有其他问题,但那个问题突然出现在我身上。)

于 2013-07-02T14:23:05.890 回答
0

我认为您可以简化很多事情:

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

将匹配您提出的所有三个案例并捕获正确组中的所有内容(如果存在)。但是,它也会匹配..您可能不想要的。因此,我们可以添加一个积极的前瞻断言来确保至少存在一个 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]
}
于 2013-07-02T14:06:33.217 回答