这是我写的选择所有从 A 开始的名字的代码:
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 个字符的名称。所以预期的输出是:Amitha、Adele、Ariana。
当我输入这个时,只返回 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,}
as[a]
已经匹配 1 个字母。
使用这个正则表达式来解决这个问题(虽然它不是最好的,请看下面的原因):
(?i)(\s|^)a[a-z]{4,}(\s|$)
细节
(?i)
- 不区分大小写的修饰符(\s|^)
- 空格或字符串的开头a
- 一个a
或一个A
字母[a-z]{4,}
- 任何 4 个或更多 ASCII 字母(\s|$)
- 一个空格或一个字符串的结尾(注意:空格将被消耗,并且连续匹配的单词将不会被正确处理)。您可以使用"(?i)(?<!\\S)a[a-z]{4,}(?!\\S)"
模式来确保在空格或字符串位置的开始/结束之间匹配一个单词。
或者,使用单词边界 - "(?i)\\ba[a-z]{4,}\\b"
。
请参阅Java 在线演示:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句