2016-12-05 105 views
0

我有很多的文字,看起來像(這是例子):正則表達式得到句子與特定的單詞

一些隨機字符串,內容等,沒有什麼特別的開幕式上的我想XZXDS第一個文本。另一個隨機字符串,一些不必要的消息等CLOSING我想要得到的第二個文本。然後更多的內容和內容打開我希望得到的LLXAS第三個文本。再次無聊的消息,沒有關閉我想要得到的第四個文本。等等...

我想要得到每個包含單詞的句子:TEXT。例如,在這種情況下,我會得到:

我想要的第一個文本。

我想要的第二個文本。

我想要的第三個文本。

我希望得到的第四個文本。

我認爲這是可能的方式是: 在我的文字有隨機文本,但本文最後總是「開幕式上的XXXX」或「關閉」。所以我認爲我可以在「XXXX」或「CLOSING」和「。」之間輸入我的文字。 (點)。 XXX可以不同,它需要排除。有人可以幫助正則表達式函數嗎?

只要打開開始前的所有內容,排除一個單詞是什麼在打開後,讓我的文字,直到它達到「。」。

我曾經有類似的東西,但是因爲我用兩個點之間的特定單詞來判斷句子,所以更容易些。現在我的句子之間沒有兩個點。 我添加的代碼爲我曾經有:

String pattern = "[^\.]*\bSPECIFICWORD\b[^\.]*" 

,我認爲我們能保持的第二部分,但第一部分需要進行改性殼聚糖。

我需要它爲我的Java應用程序。 謝謝你的幫助。

+0

提高您的示例文本請,因爲它沒有包括「開幕式上的」和'CLOSING'文本。 – Bruno

+0

@布魯諾我改進了一點,希望你能理解我想達到的目標。 – ktos1234

回答

2
Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))" 
      + "((?:[^\\.]*?)*TEXT(?:[^\\.]*?))\\." 
      , Pattern.CASE_INSENSITIVE); 
    final String text = "random text random text random text opening " 
      + "by xysd FIRST TEXT I WANT TO GET. random text random " 
      + "text random text closing SECOND TEXT I WANT TO GET. " 
      + "random text random text random text opening by lxcvznk " 
      + "THIRD TEXT. random text random text random text random " 
      + "text closing FOURTH TEXT...etc"; 
    Matcher m = p.matcher(text); 
    while(m.find()) 
    { 
     System.out.println(m.group(1)); 
    } 

輸出:

FIRST TEXT I WANT TO GET 
SECOND TEXT I WANT TO GET 
THIRD TEXT 
FOURTH TEXT 

(?:opening by [^ ]+)|(?:closing))開始於「由XXX開口」或「關閉」

(?:[^\\.]*?)*任何非點的字符,隨後空間(根據需要的空間可以被排除)零次或多次

(?:[^\\.]*?))\\.其後是非點序列。

如果文本輸入異常大,單個正則表達式可能不是最好的方法,它可能會更快地搜索前綴,然後明確點字符。

正如評論中所討論的那樣,如果要捕獲包含兩個單詞中的任何一個的句子,例如ONE或ANOTHER,只需使用(?:ONE|ANOTHER)替換TEXT。它在邏輯運算符部分的Pattern文檔中有描述。

如果你想知道究竟你是否明白哪一個,你可以使用捕獲組(ONE|ANOTHER)並把它在matcher.group(2)

Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))" 
      + "((?:[^\\.]*?)*(ONE|ANOTHER)(?:[^\\.]*?))\\." 
      , Pattern.CASE_INSENSITIVE); 
    final String text = "random text random text random text opening " 
      + "by xysd FIRST ONE I WANT TO GET. random text random " 
      + "text random text closing SECOND ANOTHER I WANT TO GET. " 
      + "random text random text random text opening by lxcvznk " 
      + "ANOTHER TEXT. random text random text random text random " 
      + "text closing FOURTH ONE...etc"; 
    Matcher m = p.matcher(text); 
    while(m.find()) 
    { 
     System.out.println(m.group(1) + "<-" + m.group(2)); 
    } 

FIRST ONE I WANT TO GET<-ONE 
SECOND ANOTHER I WANT TO GET<-ANOTHER 
ANOTHER TEXT<-ANOTHER 
FOURTH ONE<-ONE 
+0

文字輸入很大,它來自html文檔,我想要得到的文字就在這個文檔的底部。我會嘗試你爲我寫的功能,我們會看到。 – ktos1234

+0

大到我的意思是處理成千上萬兆字節的文件,單個html可能在現代硬件上可以忽略不計。 –

+0

好吧,我查過了,它工作正常!謝謝。還有一個問題。我有一個按鈕,點擊後我想轉到下一句話。我是否必須將所有匹配放在數組中,還是最簡單的方法在所有句子之間移動? – ktos1234

相關問題