我想從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