Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式:如何选择以特定字母开头的单词以及x个字符长?_Java_Regex - Fatal编程技术网

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
    字母
  • [a-z]{4,}
    -任意4个或更多ASCII字母
  • (\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