摘要:正則表達式等待匹配的字符這里可以輸入任何繼承了的類返回一個值說明是否匹配這里需要注意的是,和均不允許通過構造器新建一個對象。
前言
之前一直想要做一個自己的爬蟲,然后從nba數據相關的網上【虎撲,騰訊,官網等,要視網站是否支持】爬點數據寫數據分析和圖形化展示。雖然年輕的時候就實現過這個功能,但是當時直接借用了一個網上現成的jar包,然后在那個基礎上寫了一個非常簡陋的正則表達式來提取數據。這次打算自己用JAVA API寫一個爬蟲,里面除了能讀取HTML或是JSON或是XML,還要能夠相應的支持多線程【這個功能將最后完成】。
今天這篇博客重點講解java中和正則表達式相關的API為后序程序的實現做一個鋪墊。后序的實現將在未來的博客3或4或5中展示,也會提供github源碼來供大家參考和指教。所以也歡迎大家關注我,以便獲得后序的更新。
關于正則表達式的基本知識請參考我的博客正則表達式 深入淺出1--你的符號我做主【持續更新中
在這里,我需要再補充一些博客1中沒有提及但是必須了解的知識。(完整的正則表達式構造子列表請參考JAVA的API,在文章最后有給出傳送門)
在博客1中,我將最常用的一些符號整理出來,這里再說一些還需要了解的符號。
字符
xhh 十六進制值為0xhh的字符
uhhhh 十六進制表示為oxhhhh的Unicode字符
字符類
[abc[def]] 相當于合并操作 等價于[abcdef]
[a-z&&[hij]] 相當于交集操作,等價于[hij]
[a-z&&[^b-d]] 相當于減操作 等價于[ae-z]
邊界匹配符
詞的邊界,詞的邊界是指w和W之間的位置,它是一個定位符,并不代表任何具體的字符
B 非詞的邊界,也就是是w和w 以及W和W之間的位置
這里新添的兩個定界符有點難理解。我們已知w是指詞字符[a-zA-Z0-9],而W是指[^a-zA-Z0-9]。這里舉個例子來說明b和B都匹配了什么。
假設我們待匹配的字符串為"hello world!
"
如果調用方法String[] result = s.split("");
那么我們會發現輸出為["hello", "world", " ", "! rn"],也就是說我們可以將字符串看成是"_hello_ _world_!
"其中_代表單詞分界處。
那么如果_代表非單詞分界處,那么上述句子可以表示成"h_e_l_l_o w_o_r_l_d!_
_
"
那么,在大多數情況下,我們都會通過詞的邊界符來實現獲取而不是進行判斷。
量詞量詞描述了一個模式吸收輸入文本的方式。量詞總共分為三種,貪婪型、勉強型和占有型。下面分別介紹這三種量詞以便更好的構建正則表達式。
貪婪型
貪婪型模式下的正則表達式會發現盡可能多的匹配。也就是說,即便當前情況已經滿足了匹配,貪婪模式還是會繼續測試下一個字符直至匹配失敗為止。一旦匹配失敗,就開始回退直至找到合適的匹配。
在默認情況下的一般正則表達式都是貪婪型的。
勉強型
在希望勉強匹配的正則表達式后面加?號即可進行勉強匹配。勉強匹配是指這個量詞滿足模式所需要的最小字符數就立刻停止。
占有型
目前,這種類型的量詞只在JAVA中才可以用。占有型不同于前面兩者,它不會進行回溯。我們知道一個正則表達式對應的字符串可能有多種。在貪婪型中,如果下一個匹配失敗,則放出已占有字符回溯到上一個滿足的情形繼續判斷。而勉強型則是多占有一個字符繼續判斷。占有型則不保存這些中間結果。一旦占有則不會釋放。
下面舉一個例子來說明這些情況:
輸入的字符串: 在Java中,和正則表達式最息息相關的兩個類就是Pattern和Matcher了。基本上所有正則表達式的底層實現都是通過Pattern和Matcher來實現的。比如說,我們非常了解的String中的matches方法,實際上也是通過Pattern和Matcher的配合來實現的。 創建正則表達式并判斷字符流是否符合。 這里需要注意的是,Pattern和Matcher均不允許通過構造器新建一個對象。不僅如此,Pattern類是相對而言線程安全的,而Matcher類不是如此。 構造器 第二個構造pattern的方法中多了一個flag參數,這個參數允許我們定義pattern的模式,這里講幾個比較重要的模式: Pattern.CASE_INSENSITIVE: 等價于正則表達式中的?i,是的匹配可以大小寫不敏感 如果希望有多個Pattern,可以輸入Pattern.compile("正則表達式", Pattern1 | Pattern2 | Pattern3) 分割 分組 查找 舉個栗子 替換 這里講一下appendReplacement和appendTail方法。appendReplacement允許開發者在替換的過程中針對將被替換的內容進行一些動態的操作。這個方法將逐步推進的向前替換,并將替換的結果添加到輸入的s中。除此以外,對于沒有被掃描到的部分,可以通過appendTail方法添加到輸入的s中。 例子: 輸出為: 其實正則表達式的適用范圍非常廣,除了和CharSequence配合使用之外,還可以和JAVA I/O如Scanner類,InputReader類等聯合使用。核心還是在于Pattern類和Matcher類的組合使用。 JAVA API 文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。 轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70212.html 摘要:它包括兩個類和一個是一個正則表達式經編譯后的表現模式。這個標志能讓表達式忽略大小寫進行匹配。默認情況下,這兩個表達式僅僅匹配字符串的開始和結束。返回當前查找而獲得的與指定的組匹配的子串內容
Pattern和MatcherJava.util.regex 是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和MatcherPattern: 一個Patt... 摘要:直接使用正則表達式對輸入的字符串進行匹配,匹配成功則返回使用正則表示式,進行字符串分割進行匹配操作,如果匹配成功,這三個方法都會返回其中,是在源字符串中找出和正則表達式匹配的字符串。
概念
正則表達式
在閱讀本文前,你應該已經了解了正則表達式的基本概念以及如何書寫正則表達式。如果對正則表達式不是太了解,或者想更深入地了解正則表示式,請點擊這里。
捕獲組
捕獲組能夠讓我們方便地從正則表達... 閱讀 1221·2021-09-03 10:44 閱讀 618·2019-08-30 13:13 閱讀 2809·2019-08-30 13:11 閱讀 1976·2019-08-30 12:59 閱讀 1044·2019-08-29 15:32 閱讀 1608·2019-08-29 15:25 閱讀 1003·2019-08-29 12:24 閱讀 1292·2019-08-27 10:58info
貪婪模式正則表達式:<.*>
返回輸出:info
勉強模式正則表達式:<.*?>
返回輸出:
占有模式正則表達式:<.*+>
返回輸出:info
Pattern和Matcher API
在這篇博客中,我將介紹重點的API,詳細的信息請各位自行參考JAVA DOC。 Pattern pattern = Pattern.compile("正則表達式");
Matcher matcher = pattern.matcher("等待匹配的字符");//這里可以輸入任何繼承了CharSequence的類
matcher.matches();//返回一個boolean值說明是否匹配
static Pattern compile(String regex)
static Pattern compile(String regex, int flag);
Pattern.COMMENTS : 等價于正則表達式中的?x,會忽略空格符和以#開頭到行末的注釋
Pattern.MULTILINE : 等價于?m,使得^和&符號可以匹配一行的始末,而不僅僅是整個字符串的始末
Pattern自己也定義了split方法。它會根據之前compile的正則表達式進行分割并返回String[],limit值是指分割出的String[]的size不會超過這個limit值。String[] split(CharSequences c, int limit)
String[] split(CharSequences c)
在這里還需要在講解一個分組的概念以便為后面做鋪墊。正則表達式的分組是指將一對括號中的表達式劃為一個分組。因此形如A(B(CD)(E))的正則表達式一共有四個分組{A(B(CD)(E)),B(CD)(E),(CD),(E)},其中第0個分組默認為完整的正則表達式。 int groupCount() //返回除了第0組的總分組數
boolean find() //從當前下標開始匹配,如果存在滿足正則表達式的值,則返回true
boolean find(int i)//從下標i開始匹配,如果存在滿足正則表達式的值,返回true
String group() //返回前一次匹配的第0個分組的內容
String group(int i)//返回前一次匹配的第i個分組的內容
int start() //返回上一次匹配成功的內容的起始下標
int end() //返回上一次匹配成功的內容的終止下標+1
Pattern p = Pattern.compile("<.*?>");
Matcher matcher = p.matcher("
data ");
while(matcher.find()){
System.out.println(matcher.group());
//先后輸出
} void replaceFirst(String replacement);
void replaceAll(String replacement);
void appendReplacement(StringBuffer s, String replacement);
void appendTail(StringBuffer s);
Pattern p = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("hello world one hello world 2");
StringBuffer s = new StringBuffer();
while(m.find()){
m.appendReplacement(s, m.group().toUpperCase());
System.out.println(s);
}
m.appendTail(s);
System.out.println(s);
相關文章
Java深入 - Java的正則表達式 Pattern和Matcher
java正則表式的使用
發表評論
0條評論
andycall
男|高級講師
TA的文章
閱讀更多
通配符證書有什么好處?常用通配符SSL證書有哪些?
我所知道的flex布局 —— 上篇
如何造一個移動端的聯動選擇器(一)
CSS魔法堂:你真的理解z-index嗎?
前端每日實戰:32# 視頻演示如何用純 CSS 創作六邊形按鈕特效
CSS3 border-radius妙用
Vue 實用分頁組件paging(頁數太多時顯示省略號)
Go 語言 Excel 類庫 Excelize 2.0.0 版本發布