2015-04-23 83 views
2

我想在Java中編寫一個類似於Java中的「split()」命令的代碼,但不會刪除與正則表達式匹配的部分。例如:Java - 幫助使用「拆分()」

String str = "ABC---DEF***GHI///JKL#@!"; 

然後

`str.split("[A-Za-z0-9]+")` returns `{"---", "***", "///", "#@!"}`. 

不過,我想寫類似split()的方法,其將字符串AT正則表達式的匹配,而不是圍繞它。

`An example of an implementaion would be: 
public static String[] splitString(String input, String regex)` 

這樣:

`splitString("ABC---123DEF***456GHI///JKL9#@6!", "[A-Za-z0-9]+")` 

會給:

`{"ABC", "---", "123DEF", "***", "456GHI", "///", "JKL9", "#@", "6", "!"}` 
+0

你有什麼迄今寫的嗎? –

+0

我開始新鮮了。 –

+0

所以你想要在結果中都有分割結果+匹配模式? –

回答

2

正如其他海報已經指出的,一種方法是使用你的模式,然後是逆。這可以用一個正則表達式來完成,([A-Za-z0-9]*)([^A-Za-z0-9]*)

String str = "ABC---DEF***GHI///JKL#@!"; 
Matcher m = Pattern.compile("([A-Za-z0-9]*)([^A-Za-z0-9]*)").matcher(str); 
List<String> result = new ArrayList<>(); 
while(m.find()) { 
    for(int i=1; i<=m.groupCount(); i++) { 
     if(!m.group(i).isEmpty()) { 
      result.add(m.group(i)); 
     } 
    } 
} 
System.out.println(StringUtils.join(result, ", ")); 

輸出:

ABC, ---, 123DEF, ***, 456GHI, ///, JKL9, #@, 6, ! 
+0

你應該修改正則表達式以匹配「+++ ABC ---...」(+1) – SubOptimal

+0

的好處。更新。 – beerbajay

1

由於正則表達式羣體是有限的,我認爲,唯一的辦法就是通過your_pattern和ANTY-your_pattern和分裂加入1結果1,如下所示:

ANTY正則表達式爲​​3210爲你。 (^爲[]否定INT開始)

public String[] splitString(String input, String regex, String antiRegex) 
{ 
    String[] letters = input.split(regex); 
    String[] symbols = input.split(antiRegex); 
    String[] result = new String[letters.length + symbols.length]; 
    for (int i = 0; i < letters.length; i++) 
    { 
     result[i] = letters[i]; 
     if (++i < symbols.length) //important: ++i, NOT i++ 
     { 
      result[i] = symbols[i]; 
     } 
    } 
    return result; 
} 

UPD:沒有檢查,如果lettess順序是先輸入字符串,所以如果你需要,添加ID。

1

您可以編寫一個方法來使用正則表達式並從原始字符串中刪除第一個找到的匹配項。我有點懶得編寫整個代碼,但是在僞代碼中它會是這樣的。您將使用兩種模式 - 一個單詞和一個在一個字符串的開頭一切:

Pattern literals="(^[A-Za-z0-9]+)"; 
Pattern everythingElse="(^[^A-Za-z0-9]+)"; 
List<String> results; 

while(str is not finished){ 
Matcher literalsMatcher= literals.matcher(str); 
if(literalsMatcher.find()){ 
    results.add(literalsMatcher.group(1)); 
    str.subString(0,literalsMatcher.group(1).length(); 
} 

Matcher everythingElseMatcher = everythingElse.matcher(str); 
if(everythingElseMatcher.find()){ 
    results.add(everythingElseMatcher.group(1)); 
    str.subString(0,everythingElseMatcher.group(1).length(); 
} 

}

類似的東西。對不起,代碼不好,但我認爲你可以明白。

2

使用匹配器查找正則表達式的所有匹配,然後自行構建分割結果。

下面的方法顯示了正則表達式的所有匹配爲:

public static void findMatches(String input, String regex) 
{ 
    Matcher matcher = Pattern.compile(regex).matcher(input); 

    while (matcher.find()) { 
     System.out.printf("%d-%d%n", matcher.start(), matcher.end()); 
    } 
} 

現在這樣使用起來你會發現指數與String.substring(beginIndex, endIndex)來創建導致你想分手的字符串數組。

+0

這實際上比使用反轉正則表達式的解決方案(包括我的)更好。 – beerbajay

0

在這裏,你有反覆版本:

public static String[] split(String msg, String expr){ 
     if (msg.split(expr).length == 1){ 
     return msg.split(expr); 
     } 
     String[] tab = msg.split(expr, 2); 
     String exprStr = msg.substring(tab[0].length(), msg.length() - tab[1].length()); 
     int exprLength = msg.length() - tab[0].length() - tab[1].length(); 
     String[] tab1 = split(msg.substring(tab[0].length() + exprLength, msg.length()), expr); 
     String[] result = new String[1 + 1 + tab1.length]; 
     result[0] = tab[0]; 
     result[1] = exprStr; 
     for (int i = 0; i < tab1.length;++i){ 
     result[i + 2] = tab1[i]; 
     } 
     return result; 

}