4

現在、入力を正規表現に一致させる JavaScript でアプリケーションを作成していますが、文字列を正規表現の一部に一致させる方法も見つける必要があります。

例えば:

var invalid = "x",
    potentially = "g",
    valid = "ggg", 
    gReg = /^ggg$/;

gReg.test(invalid); //returns false (correct)
gReg.test(valid);   //returns true (correct)

potentiallyここで、変数の値が式と正確に一致しないことをどうにかして判断する方法を見つける必要がありますが、/^ggg$/より多くの入力があれば、可能性があります!

したがって、たとえばこの場合、potentially変数は ですがg、さらに 2 つg追加すると、正規表現に一致します。/^ggg$/

しかし、 の場合、何文字追加しても式とinvalid一致することはありません。/^ggg$/


では、文字列が特定の正規表現に一致する可能性があるかどうかを判断するにはどうすればよいでしょうか?

4

5 に答える 5

1

これを試して:

var str = "abcdefgh";
var len = str.length;
var reg = "";
for(var i = str.length - 1; i > 0; i--)
{
  //replace '(' with '(?:' to make it non capturing.
  reg = '(' + str[i] + reg + ')?'; 
}
reg = "^" + str[0] + reg + "$";

var regex = new RegExp(reg);
于 2010-04-23T12:35:34.063 に答える
1

これについての考え方を単純に「逆」にして、「可能性」を正規表現に変えて、反対方向にテストしてみてはどうでしょうか。

var invalid = "x",
    potentially = "g",
    valid = "ggg", 
    validReg = new RegExp("^"+valid+"$"),
    invalidReg = new RegExp(invalid),
    potentialReg = new RegExp(potentially);

//test actual matches
validReg.test(invalid); //returns false (correct)
validReg.test(valid);   //returns true (correct)

//test potential matches
potentialReg.test(valid); //returns true
invalidReg.test(valid);   //returns false
于 2010-04-23T13:29:07.403 に答える
0

一般的な解決策はありません。正規表現が例のような単純な文字列の場合 (この場合、正規表現を使用しても意味がありません)、単純な文字列比較を使用できます。

var invalid = "x",
potentially = "g",
valid = "ggg";
var gReg = "ggg";

function test(t, s) {
  if (t === s) return true;
  if (t.indexOf(s) === 0) return "potentially";
  return false;
}

test(gReg, invalid);     // false
test(gReg, potentially); // "potentially"
test(gReg, valid);       // true

それ以外の場合は、gReg が受け入れるすべての文字列のすべてのプレフィックスを受け入れる別の正規表現を手動で作成できます。() を使用する必要がありますか? 多くの。

于 2010-04-23T13:00:29.467 に答える
0

明らかに、以下のテスト関数は、まさにあなたが望むものではありません...うまくいけば、問題に取り組む方法についてのアイデアが得られます.

function test(reg,string){
   var r = reg.exec(string);
     if(r){
         if(r.pop()){
             return true;
         }
         return "potentially";
     }
     return false;
}

var invalid = "x",
    potentially = "a",
    potentially2 = "ab",
    valid = "abc", 
    gReg = /^a(b(c)?)?$/;

alert(test(gReg,invalid)); //returns false (correct)
alert(test(gReg,potentially));   //returns "potentially" (correct)
alert(test(gReg,potentially2));   //returns "potentially" (correct)
alert(test(gReg,valid));   //returns true (correct)
于 2010-04-23T12:37:13.467 に答える
0
function have_potential(input, valid) {
    if ( (new RegExp('^' + valid + '$')).test(input) ) return false;
    if ( (new RegExp(input)).test( valid ) ) return true;
    return false;
}

var valid = 'aaa|bbb';

console.log( have_potential('a',valid) )
// true
console.log( have_potential('c',valid) )
// false
console.log( have_potential('aaa',valid) )
// false

編集:短縮版

function have_potential(input, valid) {
    return ( (new RegExp(input)).test( valid ) && !(new RegExp('^' + valid + '$')).test(input) );
}

Edit2: indexOf は、そもそもより良いでしょう。関数にはフラット文字列の入力が必要であり、「有効」には「|」で区切られたリストが含まれる場合があります

function have_potential(input, valid) {
    return ( valid.indexOf(input) !== -1 && !(new RegExp('^' + valid + '$')).test(input) );
}
于 2010-04-23T12:45:23.693 に答える