【问题标题】:Regex: How to match a string that is not only numbers正则表达式:如何匹配不仅是数字的字符串
【发布时间】:2011-04-19 08:46:08
【问题描述】:

是否可以编写一个正则表达式来匹配所有不包含数字的字符串?如果我们有这些字符串:

  • abc
  • a4c
  • 4bc
  • ab4
  • 123

它应该匹配前四个,而不是最后一个。我曾尝试在 RegexBuddy 中摆弄前瞻之类的东西,但我似乎无法弄清楚。

【问题讨论】:

    标签: regex


    【解决方案1】:
    /^\d*[a-z][a-z\d]*$/
    

    或者,不区分大小写的版本:

    /^\d*[a-z][a-z\d]*$/i
    

    可能是一个数字开头,然后是至少一个字母,然后是字母或数字

    【讨论】:

      【解决方案2】:

      我必须在 MySQL 中做类似的事情,而以下过度简化的事情似乎对我有用:

      其中字段名正则表达式^[a-zA-Z0-9]+$ 和字段名不是正则表达式^[0-9]+$

      这会显示所有字母和字母数字字段,但任何只是数字的字段都被隐藏。这似乎有效。

      示例:

      name1 - 已显示
      名称 - 显示
      name2 - 显示
      name3 - 显示
      name4 - 显示
      n4ame - 显示
      324234234 - 未显示

      【讨论】:

      • 不太清楚为什么有人编辑了这个但没有真正改变任何东西,然后当解决方案完美运行时将其标记下来。 (我自己实现的)
      【解决方案3】:

      我在我的 JavaScript 代码中使用/^[0-9]*$/gm 来查看字符串是否只是数字。如果是,那么它应该失败,否则它将返回字符串。

      下面是带有测试用例的工作代码 sn-p:

      function isValidURL(string) {
        var res = string.match(/^[0-9]*$/gm);
        if (res == null)
          return string;
        else
          return "fail";
      };
      
      var testCase1 = "abc";
      console.log(isValidURL(testCase1)); // abc
      
      var testCase2 = "a4c";
      console.log(isValidURL(testCase2)); // a4c
      
      var testCase3 = "4bc";
      console.log(isValidURL(testCase3)); // 4bc
      
      var testCase4 = "ab4";
      console.log(isValidURL(testCase4)); // ab4
      
      var testCase5 = "123"; // fail here
      console.log(isValidURL(testCase5));

      【讨论】:

        【解决方案4】:
        .*[^0-9]{1,}.*
        

        对我们来说很好。

        我们想使用使用过的答案,但它不适用于 YANG 模型。

        我在这里提供的内容很容易理解,而且很清楚: start 和 end 可以是任何字符,但是,必须至少有一个 NON NUMERICAL 字符,这是最大的。

        【讨论】:

          【解决方案5】:
          (?!^\d+$)^.+$
          

          这表示不包含所有数字但与整行匹配的行的前瞻。

          【讨论】:

          • 这基本上是我最终的结果:)
          • 所以...基本上你想出了一个复杂的 /\D/ 表达式。
          • 好吧,没有 \D 与我的不同,因为它只匹配非数字。当进行匹配时,我的返回包含整个字符串的匹配项,而 \D 每行可能是多个匹配项。我的正则表达式返回 4 个匹配项,而 \D 返回 17 个(对于每个非数字)。
          • @Mike Cheel 我明白了。如果这就是 Svish 正在寻找的东西,那么他的问题肯定是不清楚的。不过,我知道这有什么好处。
          • @Daniel,我的问题怎么不清楚?我什至有 5 个示例,其中我标记了我想要匹配的字符串...
          【解决方案6】:

          如果您尝试匹配至少有一个字母但它们由数字和字母(或只是字母)组成的世界,这就是我使用的:

          (\d*[a-zA-Z]+\d*)+
          

          【讨论】:

            【解决方案7】:

            试试这个:

            /^.*\D+.*$/
            

            如果有任何符号,则返回true,它不是数字。适用于所有语言。

            【讨论】:

              【解决方案8】:

              如果我们想限制有效字符以便可以由一组有限的字符组成字符串,试试这个:

              (?!^\d+$)^[a-zA-Z0-9_-]{3,}$
              

              (?!^\d+$)^[\w-]{3,}$
              

              /\w+/: 匹配任何字母、数字或下划线。任何单词字符

              【讨论】:

              • 展望未来工作正常。
              【解决方案9】:

              jjnguy 在earlier revision 中正确(如果有点多余的话)。

              .*?[^0-9].*
              

              @Chad,你的正则表达式,

              \b.*[a-zA-Z]+.*\b
              

              可能应该允许非字母(例如,标点符号),即使 Svish 的示例不包括一个。 Svish 的主要要求是:不能都是数字。

              \b.*[^0-9]+.*\b
              

              然后,您不需要其中的 +,因为您只需要保证其中有 1 个非数字(可能会在 .* 的末尾覆盖更多)。

              \b.*[^0-9].*\b
              

              接下来,您可以取消任何一端的 \b,因为这些是不必要的约束(调用对 alphanum 和 _ 的引用)。

              .*[^0-9].*
              

              最后,请注意,最后一个正则表达式表明问题可以通过基础知识来解决,这些基础知识已经存在了几十年(例如,不需要前瞻功能)。在英语中,这个问题在逻辑上等同于简单地要求在一个字符串中找到 1 个反例字符。

              我们可以通过将以下内容复制到地址栏中来在浏览器中测试此正则表达式,将字符串“6576576i7567”替换为您要测试的任何内容。

              javascript:alert(new String("6576576i7567").match(".*[^0-9].*"));
              

              【讨论】:

                【解决方案10】:

                除非我遗漏了什么,否则我认为最简洁的正则表达式是......

                /\D/
                

                ...或者换句话说,字符串中是否有非数字?

                【讨论】:

                • 据我所知,如果字符串中有数字,这将失败
                • @Svish:你的说法毫无意义。
                • 我做到了。这与不包含仅数字的字符串不匹配。它匹配一个非数字的字母。如果我把它放在一个 ^ 和一个 $ 之间来匹配一个字符串,它只匹配我的第一个测试字符串。
                • 嗯,两者的行为略有不同,你可以在我的 ruby​​ 代码中看到:codes = ['abc', 'a4c', '4bc', 'ab4', '123']codes.map { |code| code.match(/\D/) }=> [#<MatchData "a">, #<MatchData "a">, #<MatchData "b">, #<MatchData "a">, nil]codes.map { |code| code.match(/(?!^\d+$)^.+$/) }=> [#<MatchData "abc">, #<MatchData "a4c">, #<MatchData "4bc">, #<MatchData "ab4">, nil]
                • /\D/ 的匹配数据返回第一个字母,而 mote complex 的匹配返回示例中的整个代码。总而言之,它们似乎都同样可用,除非出于某种原因,您需要对匹配的数据执行操作。
                【解决方案11】:

                既然你说“匹配”,不只是验证,下面的正则表达式会正确匹配

                \b.*[a-zA-Z]+.*\b
                

                通过测试:

                abc
                a4c
                4bc
                ab4
                1b1
                11b
                b11
                

                测试失败:

                123
                

                【讨论】:

                • @Jin,取决于,[a-zA-Z]\D 不同。 \D 是“不是数字”。因此,如果他们真的不想要 0-9 并且可以使用标点符号,那么是的,\D 会更准确。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-06-18
                • 1970-01-01
                • 1970-01-01
                • 2013-10-08
                • 2011-08-29
                • 1970-01-01
                • 2012-06-05
                相关资源
                最近更新 更多