带正则表达式的String.match()

时间:2015-05-27 18:26:57

标签: javascript regex string

我正在使用一些用于验证字符串的代码。字符串中的每个字母都必须用' +'要传递的符号,在这种情况下验证函数应返回true。为此,我使用带有正则表达式的String.match()来识别任何非法模式,如果匹配返回空值(即没有找到非法模式),则返回true。

当我在regex tester上测试时,我的正则表达式似乎有效,但是在jsbin之类的测试中匹配失败。任何人都可以告诉我我做错了什么,和/或是否有更好的方法我应该测试这个?

/* Using the JavaScript language, have the function SimpleSymbols(str) take the str parameter being passed and determine if it is an acceptable        sequence by either returning the string true or false. The str parameter  will be composed of + and = symbols with several letters between them (ie.++d+===+c++==a) and for the string to be true each letter must be     surrounded by a + symbol. So the string to the left would be false. The     string will not be empty and will have at least one letter. 
*/

function SimpleSymbols(str){
  // search for illegal patterns (i.e. ^+[a-z]+ or +[a-z]^+)
  var illegalPatterns = str.match( /[^+][a-z][+]|[+][a-z][^+]/ig );
  // return true if no illegal patterns are found
    return illegalPatterns === null;
}

console.log(SimpleSymbols("++a+d+"));    // expect true       
console.log(SimpleSymbols("+a+a"));  // expect false
console.log(SimpleSymbols("+a++++a+"));  // expect true
console.log(SimpleSymbols("+a++++aa+"));  // expect false

4 个答案:

答案 0 :(得分:1)

  

任何人都可以告诉我我做错了什么

您的正则表达式搜索(anything other than +)(letter)(+)(+)(letter)(anything other than +)

+a+a将匹配,因为字符串的结尾为(anything other than +)+a匹配。

您可以改用以下内容:

[a-z]{2}|^[a-z]|[a-z]$          //check if two characters are not 
                                //separated by `+` and return false

答案 1 :(得分:1)

如果匹配,则测试传递

 # ^\++(?:[a-zA-Z]\++)+$

 ^ 
 \++
 (?: [a-zA-Z] \++ )+
 $

修改
以上允许的字符是alpha和plus 所以,看起来你想拥有任何角色,但是 只有alpha必须被plus包围。

这要复杂得多 这种情况由以下正则表达式处理 如果匹配,则找到 NO 缺陷。

 # ^(?:[^a-zA-Z+]+|(?:(?:\++[a-zA-Z](?=\+))*|\++))*$

 ^                    # BOS
 (?:                  # 0 to many of either non-apha's or alphas surrounded by plus
      [^a-zA-Z+]+          # 1 to many, Not alpha nor plus
   |                     # or,
      (?:
           (?:                  # 0 to many, plus alpha
                \++
                [a-zA-Z]             # Single alpha
                (?= \+ )             # Assert, plus ahead
           )*
        |                     # or,
           \++                  # 1 to many plus
      )
 )*
 $                    # EOS

修改
我想你可以像这样做以前的正则表达式。
但是,当匹配时,发现 WAS 的缺陷。

 # (?:^|[^+])[a-zA-Z]|[a-zA-Z](?!\+)

    (?: ^ | [^+] )
    [a-zA-Z] 
 |  
    [a-zA-Z] 
    (?! \+ )

答案 2 :(得分:0)

试一试:

^[a-z][+]|[^+][a-z][+]|[+][a-z][^+]|[+][a-z]$

我向您的RegEx添加了更多案例并且已经开通了。我也在测试边界个案

DEMO



function SimpleSymbols(str){
  var illegalPatterns = str.match(/^[a-z][+]|[^+][a-z][+]|[+][a-z][^+]|[+][a-z]$/ig);
  // return true if no illegal patterns are found
    return illegalPatterns === null;
}


var result = ""
result += SimpleSymbols("++a+d+") + "\n";    // expect true       
result += SimpleSymbols("+a+a") + "\n";  // expect false
result += SimpleSymbols("+a++++a+") + "\n";  // expect true
result += SimpleSymbols("+a++++aa+") + "\n";  // expect false

document.getElementById("results").innerHTML = result;

<div id="results"></div>
&#13;
&#13;
&#13;

但我更喜欢测试有效之类的内容:

(?:\++[a-zA-Z]\++)+[a-zA-Z]\++

答案 3 :(得分:0)

您可以使用此正则表达式匹配有效字符串:

/^\+*(?:\++[a-zA-Z](?=\+))*\+*$/gmi

RegEx Demo

编辑:要检测无效匹配,您还可以使用:

/[^+][a-z](?=\+)|\+[a-z](?!\+)/gi