2017-05-11 40 views
2
public static void main(String[] args) { 
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj"; 
    Pattern p = Pattern.compile("\\d+"); 
    Matcher m = p.matcher(str); 
    List<String> strings = new ArrayList<String>(); 
    List<Integer> nums = new ArrayList<Integer>(); 
    while (m.find()) { 
     nums.add(Integer.parseInt(m.group())); 
    } 
    p = Pattern.compile("[a-z]+"); 
    m = p.matcher(str); 
    while (m.find()) { 
     strings.add(m.group()); 
    } 
    System.out.println(nums); 
    System.out.println(strings); 
} 

輸出轉換一組字符串:的Java通過更換speacial字符

[12, 124, 1234, 123, 1234] 
[astv, atthh, ggh, dhr, sfff, dgdfg, mnaoj] 

但我想輸出,如:

[12124, 1234123, 1234] 
[astv, atthhggh, dhrsfff, dgdfg, mnaoj] 
+1

你爲什麼不想要'12','124'和'123'?您需要提供一些選擇標準。 – bradimus

+0

請澄清你的問題。你能解釋一下你試圖實現的邏輯嗎? –

+0

我有一個類似「astv * 12atthh124ggh * dhr1234sfff123 * dgdfg1234 * mnaoj」的字符串,我想將這些數字和刺分別分成一個像這樣的列表[astv,atthhggh,dhrsfff,dgdfg,mnaoj] [12124,1234123,1234] –

回答

1

爲了保持原有的正則表達式的邏輯,你可以做如下:

public static void main(String[] args) { 
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj"; 
    List<String> strings = new ArrayList<>(); 
    List<Integer> nums = new ArrayList<>(); 
    Pattern digitPattern = Pattern.compile("\\d+"); 
    Pattern alphaPattern = Pattern.compile("[a-z]+"); 
    String[] splittedArray = str.split("\\*"); 
    for (String nextSplittedString : splittedArray) { 
     Matcher digitMatcher = digitPattern.matcher(nextSplittedString); 
     Matcher alphaMatcher = alphaPattern.matcher(nextSplittedString); 
     String nextDigitAsString = ""; 
     while (digitMatcher.find()) { 
      nextDigitAsString += digitMatcher.group(); 
     } 
     if (!nextDigitAsString.isEmpty()) { 
      nums.add(Integer.parseInt(nextDigitAsString)); 
     } 

     String nextString = ""; 
     while (alphaMatcher.find()) { 
      nextString += alphaMatcher.group(); 
     } 
     if (!nextString.isEmpty()) { 
      strings.add(nextString); 
     } 
    } 
    System.out.println(nums); 
    System.out.println(strings); 
} 

輸出

[12124, 1234123, 1234] 
[astv, atthhggh, dhrsfff, dgdfg, mnaoj] 

Ideone demo

1

要獲得數字數組,你可以

  • 全部替換與空字符串字母
  • 分裂星號*

- 代碼

String digitArr[] = str.replaceAll("[A-Za-z]", "").split("\\*"); 
//output 
//12124 1234123 1234 

你可以重複同樣的事情越來越字母排列

String stringArr[] = str.replaceAll("[0-9]", "").split("\\*"); 
//Output 
//astv atthhggh dhrsfff dgdfg mnaoj 

DEMO

2

ÿ您可以同時使用分裂與*那麼你可以用每個元素的工作,例如:

public static void main(String[] args) { 
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj"; 
    String[] spl = str.split("\\*");//[astv, 12atthh124ggh, dhr1234sfff123, dgdfg1234, mnaoj] 
    List<String> strings = new ArrayList<>(); 
    List<Integer> nums = new ArrayList<>(); 
    for (String s : spl) { 

     String tmp = s.replaceAll("\\d+", "");//replace all the digits with empty 
     if (!tmp.trim().isEmpty()) { 
      strings.add(tmp); 
     } 

     tmp = s.replaceAll("[a-z]+", "");//replace all the character with empty 
     if (!tmp.trim().isEmpty()) { 
      nums.add(Integer.parseInt(tmp)); 
     } 
    } 

    System.out.println(nums); 
    System.out.println(strings); 
} 

輸出

[12124, 1234123, 1234] 
[astv, atthhggh, dhrsfff, dgdfg, mnaoj] 

Ideone demo

+0

最初沒有模式編譯,需要與那個字符對齊 –

+0

是的,你有@ManojKumarGovindharaj –

+1

非常感謝分享 –