【发布时间】:2011-09-25 20:35:36
【问题描述】:
我想创建一个 Java 正则表达式来抓取所有以大写字母开头然后是大写或小写字母的单词,但这些字母可能包含重音符号。
例子:
在哪里
阿东德
快速
阿斯特
你能帮帮我吗?
【问题讨论】:
-
你试过什么?是重音位给你带来了麻烦,还是你不知道从哪里开始?
-
口音来自哪种语言?
我想创建一个 Java 正则表达式来抓取所有以大写字母开头然后是大写或小写字母的单词,但这些字母可能包含重音符号。
例子:
在哪里
阿东德
快速
阿斯特
你能帮帮我吗?
【问题讨论】:
正则表达式:
\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 二进制大写属性,因为它涵盖的不仅仅是字母,例如罗马数字。
检测给定段落中大写字母的代码。在这种情况下,输入作为控制台输入给出。
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]);
}
}
}
}
如果你给输入类似
输入:这是我的第一个程序
输出:
这个
第一
程序
【讨论】:
不用正则表达式也可以。通过将其转换为小写来验证每个单词中的第一个字母,然后检查相等性:
String firstLetter = String.valueOf(seq[i].charAt(0));
String lowerCase = firstLetter.toLowerCase();
if (!firstLetter.equals(lowerCase))
System.out.println(seq[i]);
它适用于任何口音。
【讨论】: