2013-04-08 92 views
1

尋找一些正則表達式的幫助。我在Java中尋找一種方法來分割一些輸入文本,但也保留分隔符(空格,標點符號)。另一種方法是將單詞分割成自己的索引,其他非單詞字符可以在數組的其他索引中。Java - 正則表達式來分割輸入文本,但保留分隔符

此輸入文本:

"Hello, this isn't working!" 

應放入一個這樣的數組:

{"Hello", ",", "this", "isn't", "working", "!"} 

{"Hello", ", ", "this", " ", "isn't", " ", "working", "!"} 

我使用基本做同樣的事情在Python這個:

def split_input(string): 
    return re.findall(r"[\w']+|[\s.,!?;:-]", string) 

但我還沒有找到一種方法來在Java中完成同樣的事情。我已經嘗試String.split()與前瞻/ lookbehind,我已經嘗試了模式匹配器,但沒有多少運氣。

任何幫助將不勝感激!

+0

如果空間分隔符,然後你的文字應的產品至少4個元素是不是? – anubhava 2013-04-08 12:54:24

+0

爲什麼你想要一個數組,而你只需要一個字符串呢? – Loamhoof 2013-04-08 12:54:37

回答

5

split不是Java的模擬Python的findallMatcher.find是。

Pattern stuff = Pattern.compile("[\\w']+|[\\s.,!?;:-]"); 
Matcher matcher = stuff.matcher("Hello, this isn't working!"); 
List<String> matchList = new ArrayList<String>(); 
while (matcher.find()) { 
    matchList.add(matcher.group(0)); // add match to the list 
} 
+0

啊,我確實使用了Matcher,但沒有太多。這似乎很好地完成了這項工作,謝謝! – kin3tik 2013-04-08 13:09:05

+0

這非常有用,謝謝 – 2013-12-18 14:39:06

0

所以,拋開你的怪例子,這裏是一個應該滿足您的需要的東西(還有待檢驗):

"(?=[\\w']+|[\\s.,!?;:-])" 

對於第一個版本。

"(?=[\\w']+|[\\s.,!?;:-]+)" 

要保留幾個分隔符作爲一個整體。

整個想法,正如你想拆分,但保留所有的字符,只匹配位置。

0

也許不是最好的方式做到這一點,但你可以嘗試:

string.replaceAll("([\\s.,!?;:-])", "$1\n"); 
string.split("\n"); 
1

試試這個:這是你想要的到底是什麼。

public static void main(String[] args) { 
    String str = "Hello, this isn't working!"; 
    String[] s = str.split("(?<=\\s+|,\\s)"); 
    System.out.println(Arrays.toString(s)); 
} 

輸出:

[Hello, , this , isn't , working!]