admin管理员组

文章数量:1318156

^(?=[\w\-%&?#=]+\d)(?=[\w\-%&?#=]+[a-zA-Z])[\w\-%&?#=]{8,12}$

Was meant to match the below conditions in a JavaScript based new-password check,

  • Must contain minimum 8 to 20 characters, mandatorily including one letter and number
  • May include only one of the following special characters: %,&, _, ?, #, =, -
  • Cannot have any spaces

With above regex, goog123# was matched in FF3.5. However this fails in IE6. Anyone knows what went wrong here? Is this a patibility issue?

JavaScript used to test the matching

function fnIsPassword(strInput)
{
  alert("strInput : " + strInput);
  var regExp =/^(?=.{0,19}\d)(?=.{0,19}[a-zA-Z])[\w%&?#=-]{8,20}$/;
  if(strInput.length > 0){
     return (regExp.test(strInput));
  }
  return false;
}
alert(fnIsPassword("1231231")); //false 
alert(fnIsPassword("sdfa4gggggg")); //FF: true, false in IE  
alert(fnIsPassword("goog1234#")); //FF: true , false in IE 
^(?=[\w\-%&?#=]+\d)(?=[\w\-%&?#=]+[a-zA-Z])[\w\-%&?#=]{8,12}$

Was meant to match the below conditions in a JavaScript based new-password check,

  • Must contain minimum 8 to 20 characters, mandatorily including one letter and number
  • May include only one of the following special characters: %,&, _, ?, #, =, -
  • Cannot have any spaces

With above regex, goog123# was matched in FF3.5. However this fails in IE6. Anyone knows what went wrong here? Is this a patibility issue?

JavaScript used to test the matching

function fnIsPassword(strInput)
{
  alert("strInput : " + strInput);
  var regExp =/^(?=.{0,19}\d)(?=.{0,19}[a-zA-Z])[\w%&?#=-]{8,20}$/;
  if(strInput.length > 0){
     return (regExp.test(strInput));
  }
  return false;
}
alert(fnIsPassword("1231231")); //false 
alert(fnIsPassword("sdfa4gggggg")); //FF: true, false in IE  
alert(fnIsPassword("goog1234#")); //FF: true , false in IE 
Share Improve this question edited Jun 13, 2011 at 4:36 Yi Jiang 50.2k16 gold badges138 silver badges136 bronze badges asked Dec 14, 2009 at 14:02 maysmays 3971 gold badge3 silver badges11 bronze badges 2
  • 13 If something fails on IE6, there's nothing wrong. – Rubens Farias Commented Dec 14, 2009 at 14:05
  • 1 @Rubens Quite possibly the most funny and accurate statement I have heard in a long while – Chris Commented Apr 12, 2011 at 13:28
Add a ment  | 

2 Answers 2

Reset to default 4

The regex has a number of issues. Try this one instead:

^(?=.{,19}\d)(?=.{,19}[a-zA-Z])[\w%&?#=-]{8,20}$

which is:

^                    # start-of-string
(?=.{,19}\d)         # look-ahead: a digit within 20 chars
(?=.{,19}[a-zA-Z])   # look-ahead: a letter within 20 chars
[\w%&?#=-]{8,20}     # 8 to 20 chars of your allowed range
$                    # end-of-string

This is what i found with some sifting.

  1. While finding the lower count for occurrences, counting starts from the end of the first lookahead match. Albeit this, final matches will be made only from the start of the string.
  2. For upper count, behavior is as expected.

The final regex for this issue is

/(?=^[\w%&?#=-]{8,12}$)(?=.+\d)(?=.+[a-zA-Z]).+/

本文标签: regexJavaScriptRegExp compatibility in IE Stack Overflow