2013-08-29 210 views
2

我想从Java中的字符串中找到所有三个字母的子字符串。我应该得到“exa”,“xam”,“amp”,“mpl”,“ple”,“str”,“tri”,“rin”,“ing” ”。我尝试使用Java正则表达式“([a-zA-Z]){3}”但我只有“exa”,“mpl”,“str”,“ing”。查找字符串中的所有3个字符长度的子字符串

有人可以告诉我一个正则表达式或方法来纠正这种情况。

+9

这是锤子/钉子综合症。你有一个全新的锤子(正则表达式),一切看起来像一个钉子。这是一个正则表达式是使用错误的工具的情况。只需从位置0迭代到长度为3,并在每个索引处取出子字符串。如果您需要忽略空格,请先创建一个空格字符串,并先删除空格。 –

+2

@JimGarrison只是删除空格将无法正常工作。在这个例子中,你会得到无效结果'les'和'est'。 – jpmc26

回答

6

实施Juvanis'的想法有点,迭代,让您的子串,然后用正则表达式,以确保子是所有的字母:

String s = "example string"; 
for (int i = 0; i <= s.length() - 3; i++) { 
    String substr = s.substring(i, i + 3); 
    if (substr.matches("[a-zA-Z]+")) { System.out.println(substr); } 
} 
+1

除了if和print语句中的小括号错误外,在我看来,这是迄今为止最简单的正确解决方案。 –

+0

@MLD_Saturn谢谢。这个想法主要是Juvanis';我刚刚实施它并添加了包含字母的验证。请至少给他/他一个upvote。 – jpmc26

3

当一个字符在一个正则表达式中被使用时,它不能在其他正则表达式中使用。在你的例子中,a消耗在exa所以amp将不会被列为输出。你应该尝试传统的迭代方法。实施起来更容易。

3

试试这个

Matcher m = Pattern.compile("([a-zA-Z]){3}").matcher("example string"); 
    for (int i = 0; m.find(i); i = m.start() + 1) { 
     System.out.print(m.group() + " "); 
    } 

输出

exa xam amp mpl ple str tri rin ing 
+0

一个很好的解决方案 –

1

这可以通过使用正则表达式如下进行:

  1. 使用正则表达式\w(?=\w\w)查找字符串所有匹配的位置。这将为您提供每个必需子字符串的第一个字符的开始索引。

    在这种情况下,你会得到:01234891011

  2. 获取你所需要的,采取从每个位置开始的子串会高达即加2

    在这种情况下,这将意味着,my_string.substring(0,3)my_string.substring(1,4)等,作为开始索引参数包括端点索引参数是独占的。

相关问题