Java正则表达式:如何选择以特定字母开头的单词以及x个字符长?
这是我编写的代码,它选择从以下位置开始的所有名称:Java正则表达式:如何选择以特定字母开头的单词以及x个字符长?,java,regex,Java,Regex,这是我编写的代码,它选择从以下位置开始的所有名称: String longString = "Amal Kamal Jamal Amitha Farook Amani Tom Adele George Ariana"; String pattern = "(?i)(\\s|^)[a][A-Za-z]+(\\s|$)"; Pattern checkRegex = Pattern.compile(pattern); Matcher regexMatcher = checkRegex.matcher(
String longString = "Amal Kamal Jamal Amitha Farook Amani Tom Adele George Ariana";
String pattern = "(?i)(\\s|^)[a][A-Za-z]+(\\s|$)";
Pattern checkRegex = Pattern.compile(pattern);
Matcher regexMatcher = checkRegex.matcher(longString);
while (regexMatcher.find()) {
System.out.println(regexMatcher.start() + " : " + regexMatcher.group());
}
产量如预期
0 : Amal
16 : Amitha
30 : Amani
40 : Adele
53 : Ariana
现在我想选择至少5个字符长的名称。所以预期的结果是:阿米塔,阿黛尔,阿丽亚娜
当我输入这个时,只返回Ariana。我不明白为什么
String pattern = "(?i)(\\s|^)[a][A-Za-z]+(\\s|$){5,}";
输出
53 : Ariana
如果我在整个表达式周围放一个括号(也就是说这个表达式应该有5个字符长),那么输出什么都不是
String pattern = "(?i)((\\s|^)[a][A-Za-z]+(\\s|$)){5,}";
写这篇文章的正确方法是什么?你量化了(\\s |$)
,而你需要量化[a-zA-Z]
。因此,您只匹配单词后面有5个或更多空格或5个或更多字符串结尾(当然没有意义)的文本。另外,您需要使用{4,}
,因为[a]
已经匹配了一个字母
使用此正则表达式修复此问题(尽管它不是最好的,请参见下面的原因):
详细信息
-不区分大小写修饰符(?i)
-空格或字符串开头(\s |^)
-一个a
或a
字母a
-任意4个或更多ASCII字母[a-z]{4,}
-空格或字符串的结尾(注意:空格将被使用,连续匹配的单词将无法正确处理)(\s |$)
您可以使用
”(?i)(?您是否尝试将[A-Za-z]
之后的+
替换为{5,}
?您量化了(\\s |$)
,而您需要量化[A-Za-z]
。因此,您只匹配具有5个或5个或更多空格的文本(当然没有意义)在单词后面。另外,你需要使用{0,4}
,因为[a]
已经匹配了1个字母。(?)i(\\s|^[a][a-Za-z]{4,}(\\s|$)解决了它。谢谢你@OlegEstekhin和Wiktor Stribiżew:)我不明白{5,}正在进行操作。感谢您的解释:)@Enzio请查看我的编辑。请注意,我会选择带有lookarounds或单词边界的版本。这取决于进一步的要求。
(?i)(\s|^)a[a-z]{4,}(\s|$)
String longString = "Amal Kamal Jamal Amitha Farook Amani Tom Adele George Ariana";
String pattern = "(?i)(?<!\\S)a[a-z]{4,}(?!\\S)";
Pattern checkRegex = Pattern.compile(pattern);
Matcher regexMatcher = checkRegex.matcher(longString);
while (regexMatcher.find()) {
System.out.println(regexMatcher.start() + " : " + regexMatcher.group());
}
17 : Amitha
31 : Amani
41 : Adele
54 : Ariana