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,但是如果再附加两个g',它将匹配正则表达式/^ggg$/

但在 的情况下,无论您附加多少字符invalid,它都永远无法匹配表达式。/^ggg$/


那么如何确定一个字符串是否具有匹配特定正则表达式的潜力呢?

4

5 回答 5

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 回答
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 回答
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

Edit: shorten version

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

Edit2: indexOf would be better in first place. function requires flat string inputs and "valid" may contain a list separated by "|"

function have_potential(input, valid) {
    return ( valid.indexOf(input) !== -1 && !(new RegExp('^' + valid + '$')).test(input) );
}
于 2010-04-23T12:45:23.693 回答
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

没有通用的解决方案。如果正则表达式是一个简单的字符串,例如示例中的字符串(在这种情况下,根本没有必要使用正则表达式),您可以使用简单的字符串比较:

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 回答