假如咱們有大量相似於下面的數據:java
1.神要是公然去跟人做對,那是任何人都難以對付的。 (《荷馬史詩》)
2.生存仍是毀滅,這是一個值得思考的問題。 (《哈姆霄特》)
3.善良人在追求中縱然迷惘,卻終將意識到有一條正途。(《浮士德》)
4.認識本身的無知是認識世界的最可靠的方法。 (《隨筆集》)
5.你覺得我貧窮、相貌平平就沒有感情嗎?我向你發誓,若是上帝賦予我財富和美貌,我會讓你沒法離開我,就像我如今沒法離開你同樣。雖然上帝沒有這麼作,可咱們在精神上依然是平等的。(《簡·愛》)正則表達式
咱們要作的事情是提取出其中的內容和書名,如1.神要是公然去跟人做對,那是任何人都難以對付的。 (《荷馬史詩》)咱們須要提取出類容「神要是公然去跟人做對,那是任何人都難以對付的。」和書名「荷馬史詩」。咱們該怎麼作呢?下面就讓咱們用正則表達式來完成它吧。code
import java.util.regex.Matcher; import java.util.regex.Pattern; public class LookAround { private static final String input ="1.神要是公然去跟人做對,那是任何人都難以對付的。 (《荷馬史詩》)\n2.生存仍是毀滅,這是一個值得思考的問題。 (《哈姆霄特》)\n3.善良人在追求中縱然迷惘,卻終將意識到有一條正途。(《浮士德》)\n4.認識本身的無知是認識世界的最可靠的方法。 (《隨筆集》)\n5.你覺得我貧窮、相貌平平就沒有感情嗎?我向你發誓,若是上帝賦予我財富和美貌,我會讓你沒法離開我,就像我如今沒法離開你同樣。雖然上帝沒有這麼作,可咱們在精神上依然是平等的。(《簡·愛》)"; public static void main(String[] args) { /** * 向後查找(?<=) * (?<=(\\d+[\\.\\.]))是匹配1.可是不消費它,也就是最終匹配中沒有1. * ([^((]?)*是匹配任意字符,除了(( */ String regexc ="(?<=(\\d+[\\.\\.]))([^((]?)*";//向後查找 /** * 向前查找(?=) * (?<=《)向後查找《 * (?=》)向前查找》 和向後查查同樣查找可是不消費它 */ String regext = "(?<=《)(.?)*(?=》)"; Pattern pattern = Pattern.compile(regexc); Matcher matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("內容:"+matcher.group()); } pattern = Pattern.compile(regext); matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("書名:"+matcher.group()); } } }
怎麼樣,還不錯吧。不過值得注意的是在用正則表達式處理文本是時候還要注意全角和半角的問題。若是有時候你發現本身的正則表達式沒有什麼問題,可是就是不能匹配成功,那麼就能夠考慮一下是不是標點符號的全角和半角問題。最容易出錯的就是全角空格和半角空格,一看就是空格,一匹配就失敗。我掉進這個坑裏好久才發現緣由,但願這一點經驗能對您有所幫助。
input