【问题标题】:javascript regex to return letters onlyjavascript正则表达式仅返回字母
【发布时间】:2014-06-01 22:47:18
【问题描述】:

我的字符串可以是 A01、B02、C03,将来也可能是 AA18。我想我可以使用正则表达式来获取字母并处理我的正则表达式,因为我没有做太多事情。我写了这个函数:

function rowOffset(sequence) {
              console.log(sequence);
            var matches = /^[a-zA-Z]+$/.exec(sequence);
            console.log(matches);
            var letter = matches[0].toUpperCase();
            return letter;
}

var x = "A01";
console.log(rowOffset(x));

我的matches 继续为空。我这样做正确吗?看了这篇文章,我认为正则表达式是正确的:Regular expression for only characters a-z, A-Z

【问题讨论】:

  • 链接的正则表达式 ^[a-zA-Z\s]+$ 有不同的用途:它旨在验证字符串 only 是否包含字母(和空格)。你想 match 字母 within 一个字符串。
  • 我想指出,这个问答的目标是仅英文字母,它不是“所有字母”,而实际上只是 az/AZ 没有 变音符号/重音字母,它不会 匹配 é, è, ê, ë, ç, ñ, ø, ð, å, æ, œ, ē, č, ŭ 等字母... :) 因为你需要 @987654326 @

标签: javascript regex


【解决方案1】:

你对另一个问题的目标感到困惑:他想检查他的字符串中是否有只有个字母。

您需要删除锚点^$,它们分别匹配字符串的开头和结尾:

[a-zA-Z]+

这将匹配您输入字符串中的第一个字母。

如果可能有更多(即您希望单个字符串中有多个匹配项),请使用

sequence.match(/[a-zA-Z]+/g)

【讨论】:

    【解决方案2】:

    您可以使用String#replace 删除输入字符串中的所有非字母:

    var r = 'AA18'.replace(/[^a-zA-Z]+/g, '');
    //=> "AA"
    

    【讨论】:

      【解决方案3】:

      您的主要问题是在正则表达式模式中使用了 ^$ 字符。 ^ 表示字符串的开头,$ 表示结尾,因此您的模式正在寻找一个ONLY 一组一个或多个字母的字符串,从开头到结尾字符串。

      此外,如果您想获取每个单独的字母实例,您需要在正则表达式模式的末尾包含“全局”指示符 (g):/[a-zA-Z]+/g。忽略它意味着它只会找到模式的第一个实例,然后停止搜索。 . .添加它将匹配所有实例。

      这两个更新应该会让你继续前进。


      编辑:

      另外,您可能希望使用match() 而不是exec()。如果您有一个包含多个值的字符串(例如,"A01, B02, C03, AA18"),match() 会将它们全部返回到一个数组中,而exec() 将只匹配第一个。如果它只有一个值,那么exec() 就可以了(而且您也不需要“全局”标志)。

      如果您想使用match(),您只需将代码顺序更改为:

      var matches = sequence.match(/[a-zA-Z]+/g);
      

      【讨论】:

      • /g 不是“贪婪”,而是“全球”:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
      • @SeanKendle 。 . .从技术上讲,是的。 :) 当我回答这个问题时,我想我一定一直在考虑 fflag 如何改变行为(“贪婪”似乎比“全局”更好地描述了“捕获所有实例,而不仅仅是第一个”) .我已经更新了帖子的准确性。
      • 但是,对于正则表达式,贪婪有一个非常具体的含义,/g 不是这样的。
      【解决方案4】:

      你可以这样做:

      var r = 'AA18'.replace(/[\W\d_]/g, ''); // AA
      

      【讨论】:

        【解决方案5】:

        这个/[^a-z]/g 解决了这个问题。看下面的例子。

        function pangram(str) {
            let regExp = /[^a-z]/g;
            let letters = str.toLowerCase().replace(regExp, '');
            document.getElementById('letters').innerHTML = letters;
        }
        pangram('GHV 2@# %hfr efg uor7 489(*&^% knt lhtkjj ngnm!@#$%^&*()_');
        <h4 id="letters"></h4>

        【讨论】:

        • 这不会保留案例。 Appart,它与其他答案相同。
        【解决方案6】:

        也可以通过String.prototype.split(regex)完成。

        'AA12BB34'.split(/(\d+)/);      // ["AA", "12", "BB", "34", ""]
        'AA12BB34'.split(/(\d+)/)[0];   // "AA"
        

        这里的正则表达式将给出的字符串除以数字(\d+)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          • 1970-01-01
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多