2011-08-17 113 views
5

我有一個文本,並使用這個簡單的正則表達式來分割它的文字:[ \n]。它使用空格和換行符將文本分割成單詞。如何使用正則表達式分割文本,但分割的單詞繼續保持正則表達式分隔符?

我想知道是否有一種方法來保留拆分詞中的空格或換行符,因爲我將在處理後使用它來進行簡單的句子檢測。我正在使用String#split方法。

+0

你的\ n是否意味着什麼特別的東西(句尾)?您沒有使用「。」在多行上處理正常段落。作爲句子的結尾? – toto2

+0

@ toto2標點符號也用於確定句子結尾,但內容來自HTML內容,因此諸如標題這樣的許多句子沒有標點符號來確定句子結束的位置,只有換行符。 –

+0

我不確定您在處理HTML時應該依賴\ n,因爲您可以擁有完美的文檔而無需使用\ n。 – toto2

回答

7

您可以使用回顧後作爲@Piotr Findeisen提示(+1):

public class RegexExample{ 
    public static void main(String[] args) { 
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord"; 
    String sa[] = s.split("(?<=[ \\n])"); 
    for (String saa : sa) 
     System.out.println("[" + saa + "]"); 
    } 
} 

輸出:

[firstWordWithSpaceAfter ] 
[secondWordWithSpaceAfter ] 
[wordWithLineBreakAfter 
] 
[lastWord] 

簡短說明:

?<=是向後看,這意味着你得到了一個如果您正在查找的表達式之前的數據等於?<=之後的正則表達式(在此例中爲[ \\n]

[ \\n]是正則表達式,這意味着在[]

字符一個所以整個正則表達式的每個,所述表達/字之前的字符是空間或時間\n說分裂。

由於我們沒有嘗試匹配空間或\n,它不會刪除它們。

+0

這似乎工作,但...你能解釋正則表達式嗎? –

+0

@Renato DinhaniConceição - 我不是正則表達式專家,但我希望他的編輯足夠清晰。 – MByD

+0

你把你的正則表達式放在括號內。這是必要的? –

5

考慮使用零寬度積極lookbehind/lookahead。見Pattern javadoc各地的特殊結構(非捕獲)

0

我認爲你唯一的選擇就是做這樣的事情:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345"; 
String[] lines = myString.split("\\n"); 
Set<String[]> wordsByLine = new LinkedHashSet<String[]>(); 
for (String line : lines) { 
    wordsByline.add(line.split(" ")); 
} 
0

真的很快把我的頭頂部,如果正則表達式總是匹配單個字符,您可以使用長度來確定他們在原始字符串中的位置。然後你可以爲分隔字符取一個子字符串。

有點髒,但應該做的伎倆。

-1

我還不確定你要做什麼,但是如果\ n與「」有不同的含義 ,你應該單獨處理它們。

String[] sentences = text.split("\\n"); 
... 
for (String sentence : sentences) { 
    ... 
    String[] words = sentence.split(" "); 
    ... 
}