在JavaScript中查找没有任何数字且至少有一个大写字符的最长子字符串?

时间:2017-04-21 06:10:42

标签: javascript regex validation

我遇到了编程练习并被卡住了。问题是:

  

您需要为电子邮件定义有效密码,但仅限于此   限制是:

     

密码必须包含一个大写字符,密码不应包含数字。

     

现在,给定一个String,找到最长子串的长度   有效的密码。

我能用Java解决这个问题,但无法弄清楚如何在javascript中使用。

这是我的Java解决方案:

public int lengthOfLongestSubstring(String s) {
    int n = s.length();
    Set<Character> set = new HashSet<>();
    int ans = 0, i = 0, j = 0;
    while (i < n && j < n) {
        if (!set.contains(s.charAt(j))){
            set.add(s.charAt(j++));
            ans = Math.max(ans, j - i);
        }
        else {
            set.remove(s.charAt(i++));
        }
    }
    return ans;
}

4 个答案:

答案 0 :(得分:2)

使用两个正则表达式验证所需的字符串:\D+[A-Z]

&#13;
&#13;
try {
   var o = "a0Ba".match(/\D+/g).map(x => x.match(/[A-Z]/) ? x.length : -1);
   console.log(Math.max.apply(null, o));
} catch (e) {
   console.log(-1);
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

  

密码必须包含一个大写字符,密码不应包含数字。

根据您当前的规范,regex将匹配给定字符串中的所有有效子字符串。从那里你可以检查最长子串的字符串长度。

正则表达式: (?=[^\d]*[A-Z])[^\d]+

<强>解释

(?=[^\d]*[A-Z])将查找non-digits后跟大写字母。

[^\d]+将匹配除数字以外的多个字符。

Regex101 Demo

查看以下演示。

document.getElementById('btnfindLength').onclick = function() {
  // Try with input "aa0Baa0aaBaa00aa0Ba"
  var re = /(?=[^\d]*[A-Z])[^\d]+/g;
  var str = document.getElementById('st').value;
  var match;
  var len = 0;
  var longestSubString = null;
  do {
    match = re.exec(str);

    if (match != null) {
      console.log(match + " " + match[0].length);
      if (match[0].length > len) {
        longestSubString = match;
        len = match[0].length;
      }
    }
  } while (match);
  if (len != 0) {
    alert("Longest substring is `" + longestSubString + "` having length " + len);
  } else {
    alert('No substring found.');
  }
}
<input type="text" id="st">
<input type="button" id="btnfindLength" value="Find Length">

答案 2 :(得分:0)

我已经将您的Java代码翻译成Javascript代码,但我不确定您的代码是否有效,无论如何您想使用Javascript进行操作,请参阅以下内容:

function lengthOfLongestSubstring(s) {
    var n = s.length;
    var set = [];
    var ans = 0, i = 0, j = 0;
    while (i < n && j < n) {
        if (!set.indexOf(s.charAt(j))){
            set.push(s.charAt(j++));
            ans = Math.max(ans, j - i);
        }
        else {
            set = set.splice(s.charAt(i++), 1);
        }
    }
    return ans;
}

function test() {
  var input = document.getElementById("txtTest");
  var val = input.value;
  console.log(lengthOfLongestSubstring(val));
}
<input type="text" id="txtTest">
<input type="button" id="btnTest" onclick="test()" value="Test">

答案 3 :(得分:0)

您可以.match()RegExp /[\DA-Z]+/g匹配一个或多个不是数字字符的字符,包括大写字母。如果在-1的字符串集变量中找不到匹配项,则使用.map()RegExp.prptotype.test()来检查匹配是否包含[A-Z],如果true,则获取{{}每个匹配子字符串的1}},否则返回.length。将生成的数组传递给使用-1调用的Math.max(),以便从生成的数字数组中获取最大数字。

Function.prototype.apply()