【问题标题】:Regex to match only letters正则表达式仅匹配字母
【发布时间】:2011-04-06 18:39:33
【问题描述】:

如何编写只匹配字母的正则表达式?

【问题讨论】:

  • 你对characters的定义是什么? ASCII?汉子?异-XXXX-X? UTF8?
  • 你对regex的定义是什么?珀尔?埃马克斯?格雷普?
  • 我注意到一个字母的 \p{L} 和 Unicode 的 /u 标志匹配我的正则表达式中的任何字母,即@987654323 @

标签: regex


【解决方案1】:

使用字符集:[a-zA-Z] 匹配 A–Z 中的一个小写和大写字母。 [a-zA-Z]+ 匹配一个或多个字母,^[a-zA-Z]+$ 仅匹配仅包含一个或多个字母的字符串(^$ 分别标记字符串的开头和结尾)。

如果要匹配 A–Z 以外的其他字母,可以将它们添加到字符集中:[a-zA-ZäöüßÄÖÜ]。或者您使用预定义的字符类,例如描述作为字母的 Unicode 字符的 Unicode character property\p{L}

【讨论】:

  • 这是一个非常以 ASCII 为中心的解决方案。这将破坏几乎所有非英文文本。
  • @Joachim Sauer:它宁愿打破使用非拉丁字符的语言。
  • 已经在 90% 的德文文本中中断,更别提法文或西班牙文了。不过,意大利语可能仍然做得很好。
  • 这取决于您选择的“拉丁字符”的定义。根据您的定义,J、U、Ö、Ä 都可以被认为是拉丁字符或不是拉丁字符。但它们都用于使用“拉丁字母”进行书写的语言中。
  • \p{L} 匹配所有变音符号 sedilla 重音等,所以你应该这样做。
【解决方案2】:

如果您对拉丁字母以外的字母感兴趣,\p{L} 匹配任何 Unicode 字母

【讨论】:

  • 不是所有的正则表达式。例如,vim 正则表达式将\p 视为“可打印字符”。
  • this page 建议仅 java、.net、perl、jgsoft、XML 和 XPath 正则表达式支持 \p{L}。但主要遗漏:python 和 ruby​​(虽然 python 有 regex 模块)。
  • @Philip Potter:Ruby 使用完全相同的语法支持 Unicode 字符属性。
  • 我认为这应该是 \p{L}\p{M}*+ 以覆盖由多个代码点组成的信件,例如一个字母后跟重音符号。根据regular-expressions.info/unicode.html
  • JavaScript 在正则表达式之后需要u 来检测unicode 组:/\p{Letter}/gu
【解决方案3】:

取决于你对“字符”的含义:

[A-Za-z] - 所有字母(大写和小写)

[^0-9] - 所有非数字字符

【讨论】:

  • 我的意思是信件。它似乎没有工作。 preg_match('/[a-zA-Z]+/', $name);
  • [A-Za-z] 只是您可以使用的字符的声明。您仍然需要声明此声明必须使用多少次:[A-Za-z]{1,2}(匹配 1 或 2 个字母)或 [A-Za-z]{1,*}(匹配1 个或多个字母)
  • 嗯 à, á, ã, Ö, Ä... 也是字母,অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩא, ב, ג , , , , ... en.wikipedia.org/wiki/Letter_%28alphabet%29
  • @phuclv:确实,但这取决于编码,并且编码是程序设置的一部分(默认配置或程序配置文件中声明的配置)。当我研究不同的语言时,我曾经将它存储在一个常量中,在一个配置文件中。
  • @CatalinaChircu 编码在这里完全无关紧要。编码是一种以二进制形式对字符集中的代码点进行编码的方法,例如 UTF-8 是 Unicode 的编码。字母 OTOH 取决于语言,如果有人说 [A-Za-z] 是字母,那么必须指定正在使用的语言
【解决方案4】:

最接近的选项是

[\u\l]+

匹配一系列大写和小写字母。但是,并非所有编辑器/语言都支持它,因此使用它可能更安全

[a-zA-Z]+

根据其他用户的建议

【讨论】:

  • 不会匹配任何特殊字符。
  • 很长一段时间我一直在使用 [Az]+ 但只是注意到这允许像 ` 和 [ 之类的一些特殊字符滑入。 [a-zA-Z]+ 确实是去吧。
【解决方案5】:

你会使用

/[a-z]/gi

[]--检查给定输入之间的任何字符

a-z---涵盖整个字母表

g-----全局贯穿整个字符串

i-----获取大小写

【讨论】:

    【解决方案6】:

    Java:

    String s= "abcdef";
    
    if(s.matches("[a-zA-Z]+")){
         System.out.println("string only contains letters");
    }
    

    【讨论】:

    • 不包含ŹŻŚĄ等变音符号
    • ^ 或任何西里尔字母
    【解决方案7】:

    很少有人写成“/^[a-zA-Z]$/i”的正则表达式是不正确的,因为最后他们提到了/i,它不区分大小写并且第一次匹配后它会返回。而不是 /i 只需使用 /g 这是全局的,你也不需要把 ^ $ 用于开始和结束。

    /[a-zA-Z]+/g
    
    1. [a-z_]+ 匹配下面列表中的单个字符
    2. 量词:+在一次到无限次之间,尽可能多次,根据需要回馈
    3. a-z 介于 a 和 z 之间的单个字符(区分大小写)
    4. A-Z 介于 A 和 Z 之间的单个字符(区分大小写)
    5. g 修饰符:全局。所有比赛(第一场比赛不返回)

    【讨论】:

      【解决方案8】:
      /[a-zA-Z]+/
      

      超级简单的例子。正则表达式在网上很容易找到。

      http://www.regular-expressions.info/reference.html

      【讨论】:

        【解决方案9】:

        对于 PHP,以下将正常工作

        '/^[a-zA-Z]+$/'
        

        【讨论】:

          【解决方案10】:

          在python中,我发现以下工作:

          [^\W\d_]
          

          这是有效的,因为我们正在创建一个新的字符类 ([]),它排除 (^) 类 \W 中的任何字符(所有不在 [a-zA-Z0-9_] 中的字符),也排除任何数字 (@987654327 @) 并且不包括下划线 (_)。

          也就是说,我们采用了字符类[a-zA-Z0-9_] 并删除了0-9_ 位。你可能会问,这样写[a-zA-Z]而不是[^\W\d_]不是更容易吗?如果只处理 ASCII 文本,你会是正确的,但在处理 unicode 文本时:

          \W

          匹配任何不是单词字符的字符。这与 \w 正好相反。 > 如果使用 ASCII 标志,则它等效于 [^a-zA-Z0-9_]。

          ^ 来自the python re module documentation

          也就是说,我们将所有被认为是 unicode 中的单词字符,删除所有被认为是 unicode 中的数字字符,并删除下划线。

          比如下面的代码sn -p

          import re
          regex = "[^\W\d_]"
          test_string = "A;,./>>?()*)&^*&^%&^#Bsfa1 203974"
          re.findall(regex, test_string)
          

          返回

          ['A', 'B', 's', 'f', 'a']
          

          【讨论】:

          • 非拉丁字母呢?例如çéàñ。您的正则表达式的可读性低于\p{L}
          • 聪明的答案。也适用于重音字母。
          【解决方案11】:

          只需使用\w[:alpha:]。它是一个转义序列,只匹配可能出现在单词中的符号。

          【讨论】:

          • \w 可能并非在所有情况下都是一个好的解决方案。至少在 PCRE 中,\w 也可以匹配其他字符。引用PHP manual:““单词”字符是任何字母或数字或下划线字符,即任何可以成为 Perl“单词”一部分的字符。字母和数字的定义由PCRE 的字符表,如果进行特定于语言环境的匹配,可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于 128 的字符代码用于重音字母,这些字符由 \w 匹配。”。
          • 单词包括来自字母的其他字符
          • \w 表示匹配字母和数字
          【解决方案12】:

          使用字符组

          \D
          

          匹配除数字 0-9 以外的任何字符

          ^\D+$
          

          参见示例here

          【讨论】:

          • 这也将匹配空格、符号等,这似乎不是问题所要求的。
          【解决方案13】:

          如果您指的是任何字符编码中的任何字母,那么一个好的方法可能是删除非字母,例如空格 \s、数字 \d,以及其他特殊字符,例如:

          [!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]
          

          或者用上述否定的否定来直接描述任何字母:

          \S \D and [^  ..special chars..]
          

          优点:

          • 适用于所有正则表达式。
          • 易于编写,有时可以节省大量时间。

          缺点:

          • 很长,有时并不完美,但字符编码也可能被破坏。

          【讨论】:

            【解决方案14】:

            您可以试试这个正则表达式:[^\W\d_][a-zA-Z]

            【讨论】:

            • [^\W|\d] 不是这个意思
            • [^\W|\d] 表示不是\W,也不是|,也不是\d。它具有相同的净效应,因为 |\W 的一部分,但 | 不像您想象的那样工作。即使那样,这也意味着它接受_ 字符。您可能正在寻找[^\W\d_]
            • 我同意你的观点,它接受_。但是“NOT”| 等于“AND”,所以[^\W|\d] 表示:NOT \W AND NOT \d
            • [^ab] 表示不是a 也不是b[^a|b] 表示不是a,也不是|,也不是b。举第二个例子,[a|b|c|d][abcd|||] 完全相同,[abcd|] 完全相同——所有这些都等同于([a]|[b]|[c]|[d]|[|]) | 是文字字符,而不是 OR 运算符。 OR 运算符隐含在字符类中的每个字符之间,放置一个实际的| 表示您希望该类接受|(管道)字符。
            【解决方案15】:

            最近我在表单中使用这种模式来检查人名,包括字母、空格和特殊字符(如重音符号)。

            pattern="[A-zÀ-ú\s]+"
            

            【讨论】:

            • 您应该查看 ASCII 表。 A-z 不仅匹配字母,还匹配 À-ú
            【解决方案16】:

            所以,我已经阅读了很多答案,其中大多数都没有考虑例外情况,例如带有重音符号或分音符号(á、à、ä 等)的字母。

            我在 typescript 中创建了一个函数,该函数几乎可以外推到任何可以使用 RegExp 的语言。这是我在 TypeScript 中的个人实现我的用例。我基本上所做的就是用我想添加的每种符号添加一系列字母。在应用 RegExp 之前,我还将 char 转换为大写,这样可以节省一些工作。

            function isLetter(char: string): boolean {
              return char.toUpperCase().match('[A-ZÀ-ÚÄ-Ü]+') !== null;
            }
            

            如果您想添加具有另一种重音的其他字母范围,只需将其添加到正则表达式即可。特殊符号也是如此。

            我使用 TDD 实现了这个功能,我可以确认它至少适用于以下情况:

                character | isLetter
                ${'A'}    | ${true}
                ${'e'}    | ${true}
                ${'Á'}    | ${true}
                ${'ü'}    | ${true}
                ${'ù'}    | ${true}
                ${'û'}    | ${true}
                ${'('}    | ${false}
                ${'^'}    | ${false}
                ${"'"}    | ${false}
                ${'`'}    | ${false}
                ${' '}    | ${false}
            

            【讨论】:

              【解决方案17】:

              JavaScript

              如果要返回匹配的字母:

              ('Example 123').match(/[A-Z]/gi) // 结果:["E", "x", "a", "m", "p", "l", "e"]

              如果你想用星号('*')替换匹配的字母,例如:

              ('Example 123').replace(/[A-Z]/gi, '*') //结果:"****** 123"*

              【讨论】:

              【解决方案18】:
              /^[A-z]+$/.test('asd')
              // true
              
              /^[A-z]+$/.test('asd0')
              // false
              
              /^[A-z]+$/.test('0asd')
              // false
              

              【讨论】:

              【解决方案19】:

              模式 = /[a-zA-Z]/

              puts "[a-zA-Z]: #{pattern.match("mine bloom")}" OK

              输入 "[a-zA-Z]: #{pattern.match("456")}"

              输入 "[a-zA-Z]: #{pattern.match("")}"

              输入 "[a-zA-Z]: #{pattern.match("#$%^&*")}"

              puts "[a-zA-Z]: #{pattern.match("#$%^&*A")}" OK

              【讨论】:

              • 例如,“Zażółć gęslą jaźń”呢?
              【解决方案20】:
              Pattern pattern = Pattern.compile("^[a-zA-Z]+$");
              
              if (pattern.matcher("a").find()) {
              
                 ...do something ......
              }
              

              【讨论】:

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