2013-08-29 94 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)等,作爲開始索引參數包括端點索引參數是獨佔的。

相關問題