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

あなたの正規表現は単純化できると思います。次のコードを検討してください。

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]+)$");

文字列内の単一のバックスラッシュは、エスケープが必要な文字が続いていない場合は無視されるため、..任意の 2 文字に一致する正規表現を作成していました。正規表現リテラルを使用する方が簡単です:

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]+)?$

あなたが提案した 3 つのケースすべてに一致し、正しいグループ (存在する場合) のすべてをキャプチャします。ただし、..おそらく望ましくないものにも一致します。そのため、正の先読みアサーションを追加して、少なくとも 1 つの 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 に答える