【问题标题】:How to grab all words that start with capital letters?如何抓取所有以大写字母开头的单词?
【发布时间】:2011-09-25 20:35:36
【问题描述】:

我想创建一个 Java 正则表达式来抓取所有以大写字母开头然后是大写或小写字母的单词,但这些字母可能包含重音符号。

例子:

在哪里

阿东德

快速

阿斯特

你能帮帮我吗?

【问题讨论】:

  • 你试过什么?是重音位给你带来了麻烦,还是你不知道从哪里开始?
  • 口音来自哪种语言?

标签: java regex


【解决方案1】:

正则表达式:

\b\p{Lu}\p{L}*\b

Java 字符串:

"(?U)\\b\\p{Lu}\\p{L}*\\b"

说明:

\b      # Match at a word boundary (start of word)
\p{Lu}  # Match an uppercase letter
\p{L}*  # Match any number of letters (any case)
\b      # Match at a word boundary (end of word)

警告:这只适用于最近的 Java 版本 (JDK7);对于其他人,您可能需要用更长的子正则表达式替换\b。如您所见here,您可能需要使用(感谢@tchrist)

(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))

对于\b,Java 字符串如下所示:

"(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\]))\\p{Lu}\\p{L}*(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\]))"

【讨论】:

  • 有时我希望我可以多次对答案进行投票。这是其中之一。
  • 我认为对于字母,您可能需要字母或标记,而对于大写字母,您也可能需要大写字母。所以也许(?U)\b[\p{Lu}\p{Lt}][\pL\pM]*\b。对于某些数据集,您可能还需要 \p{upper},它是 Unicode 二进制大写属性,因为它涵盖的不仅仅是字母,例如罗马数字。
  • \p{L}* 可能与数字不匹配
【解决方案2】:

检测给定段落中大写字母的代码。在这种情况下,输入作为控制台输入给出。

import java.io.*;
import java.util.regex.*;
import java.util.Scanner;

public class problem9 {

    public static void main(String[] args) {
    String line1;
    Scanner in = new Scanner(System.in);
    String pattern = "(?U)\\b\\p{Lu}\\p{L}*\\b";

    line1 = in.nextLine();
    String delimiter = "\\s";   
    String[] words1 = line1.split(delimiter);

    for(int i=0; i<words1.length;i++){
        if(words1[i].matches(pattern)){
        System.out.println(words1[i]);
        }    
    }

  }
 }

如果你给输入类似

输入:这是我的第一个程序

输出:

这个

第一

程序

【讨论】:

    【解决方案3】:

    不用正则表达式也可以。通过将其转换为小写来验证每个单词中的第一个字母,然后检查相等性:

            String firstLetter = String.valueOf(seq[i].charAt(0));
            String lowerCase = firstLetter.toLowerCase();
            if (!firstLetter.equals(lowerCase))
                System.out.println(seq[i]);
       
    

    它适用于任何口音。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多