我想从Java中的字符串中找到所有三个字母的子字符串。我应该得到“exa”,“xam”,“amp”,“mpl”,“ple”,“str”,“tri”,“rin”,“ing” ”。我尝试使用Java正则表达式“([a-zA-Z]){3}”但我只有“exa”,“mpl”,“str”,“ing”。查找字符串中的所有3个字符长度的子字符串
有人可以告诉我一个正则表达式或方法来纠正这种情况。
我想从Java中的字符串中找到所有三个字母的子字符串。我应该得到“exa”,“xam”,“amp”,“mpl”,“ple”,“str”,“tri”,“rin”,“ing” ”。我尝试使用Java正则表达式“([a-zA-Z]){3}”但我只有“exa”,“mpl”,“str”,“ing”。查找字符串中的所有3个字符长度的子字符串
有人可以告诉我一个正则表达式或方法来纠正这种情况。
实施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); }
}
除了if和print语句中的小括号错误外,在我看来,这是迄今为止最简单的正确解决方案。 –
@MLD_Saturn谢谢。这个想法主要是Juvanis';我刚刚实施它并添加了包含字母的验证。请至少给他/他一个upvote。 – jpmc26
当一个字符在一个正则表达式中被使用时,它不能在其他正则表达式中使用。在你的例子中,a消耗在exa所以amp将不会被列为输出。你应该尝试传统的迭代方法。实施起来更容易。
试试这个
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
一个很好的解决方案 –
这可以通过使用正则表达式如下进行:
使用正则表达式\w(?=\w\w)
查找字符串所有匹配的位置。这将为您提供每个必需子字符串的第一个字符的开始索引。
在这种情况下,你会得到:0
,1
,2
,3
,4
,8
,9
,10
和11
。
获取你所需要的,采取从每个位置开始的子串会高达即加2
在这种情况下,这将意味着,my_string.substring(0,3)
,my_string.substring(1,4)
等,作为开始索引参数包括端点索引参数是独占的。
这是锤子/钉子综合症。你有一个全新的锤子(正则表达式),一切看起来像一个钉子。这是一个正则表达式是使用错误的工具的情况。只需从位置0迭代到长度为3,并在每个索引处取出子字符串。如果您需要忽略空格,请先创建一个空格字符串,并先删除空格。 –
@JimGarrison只是删除空格将无法正常工作。在这个例子中,你会得到无效结果'les'和'est'。 – jpmc26