需要上課的人員:
試題1:
下圖是台灣彩卷的大樂透資料,
網頁的原始碼為:
<tr>
<td colspan="3" class="td_org2">
大小順序
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No1_0">14</span>
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No2_0">15</span>
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No3_0">19</span>
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No4_0">24</span>
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No5_0">25</span>
</td>
<td class="td_w font_black14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No6_0">37</span>
</td>
<td colspan="2" class="td_w font_red14b_center">
<span id="SuperLotto638Control_history1_dlQuery_No7_0">06</span>
</td>
</tr>
JAVA程式碼如下:
請問Pattern.compile(" ")中的雙引號內號該填什麼,才能得到本期開獎數字?
答案:SuperLotto638Control_history1_dlQuery_No[\d]_0">(.*?)<\/span>(反白中)
答案可能不止一種,可至線上的正規表示法測試網站測試。
正規表示法(Regular Expression)
正規表示法(或稱正規表示式)是一個很強大的工具,它的功能是快速的過濾出符合特定規則的文字,並回傳給使用者,所以會有二段字串,一段是要我們要尋找的特定文字,一段是要被尋找的文字,而我們要尋找的特定文字,就是我們待會要講的正規表示式。
常用的正規表示法的特殊字元
正規表示式雖然很強大,不過因為它不好懂,而且有太多的特殊字元,每個字元又有不同的意義,所以在入門時比較不好入門;不過,要學正規表示法,並沒有其他捷徑,所以我們不能免俗的要介紹這些特殊字元,下方是筆者個人記得的特殊字元與其對應的功能,既然是筆者個人記得的,代表在工作上是比較被使用的,我們一一來介紹:
-
^ →Shift + 6
這個符號有三種意義,分別是「開始」與「不符合」及代符號^本身;判斷是那一種意義,要視擺放的位置而定,下方為範例:
-
^abc → 代表文字開頭為abc,即時^的意義為「開始」。
-
[^abc] → [ ]的意義為字元,代表這個字元必需符為[ ]內的字元,不過在[ ]裡面的^代表的是「不符合」,所以[^abc]代表這個字元必須不符合abc才行。
-
ab^c → 此時的^並沒有特別的意義。
-
* → Shift + 8
這個大家比較常用,所以很好理解,這是代表任意字元的意思,而且包含0~N個字元。
-
$ → Shift +4
這個代表每一行結尾,通常在$前方會搭配一段文字,例如:Excetpion$,代表我們要尋找該行以Exception結尾的地方。
-
[ ] → 中括號
[ ]括號中的內容代表一個字元,例如[abc],代表這個字元可以是a或b或c。
-
- →減號
這個符號必須被使用[ ]中, 代表連續的文字,其中連續的意義是以ASCII碼來計算的,例如:[0-9]代表字元可以是0到9、[a-zA-Z]代表字元可以是小寫a到z及大寫的A到Z。
-
\ → 跳脫字元
如果我們想尋找某些特殊字元,而不是它們代表的特殊意義,即需要用\來放在特殊字元的前方,例如:\*,代表*這個符號本身,而非任意字元。
-
\d → 跳脫字元+d
代表的是數字,等同[0-9]。
-
\w → 跳脫字元+w
代表文字,即[0-9a-zA-z_],注意:_(底線)也包含在其中。
-
\W → 跳脫字元+W
代表非文字,即[^0-9a-zA-z_]。
-
\s → 跳脫字元+s
會產生空白的字元也就是 [ \t\n\x0B\f\r],也就是 " "(空白)、"\t"、"\n"、"\x0B"、"\f"、"\r"。
-
( ) → 小括號
代表我們想要抓取的文字,例如:"(.*?)",代表我們想要抓取" "中的文字,後方會做更詳細的介紹。
其他還有很多,不過上方是筆者記得的,也就是常用的,如果要詳細研讀,建議可以在Google找資料。
JAVA中實作正規表示法
大概瞭解正規表示法的運作後,接來下我們要實際在JAVA中來使用它,要在JAVA使用正規表示法,必須使用java.util.regex.Pattern這個Class,如上方的題目所示:
Pattern.compile內接正規表示式,而利用Pattern中的matcher Method來實作正規表示法,例如:
執行後的結果:
在這個範例中,我們來看( )這個小括號對應的用法,程式碼為:
首先,Matcher m是從Pattern的matcher來的,傳入參數s為要比對的字串;再來利用m.find()來判斷是否有找到對應的內容,以本例來說:
配合
這一個正規表示式,在第一次的find時,會找到下方紅框處:
而m.group(0)會回傳:
SuperLotto638Control_history1_dlQuery_No1_0">14</span>
m.group(1)會回傳:
14
而第二次的while迴圈會抓到下方的紅框處:
一樣,在while中的m.group(0)會回傳:
SuperLotto638Control_history1_dlQuery_No1_0">15</span>
m.group(1)會回傳:
15
這個就是Matcher的group用法。
作業
請選定某個網頁,並取得網頁中所有的input標籤的name與value的值。
參考網址:https://www.javaworld.com.tw/jute/post/view?bid=20&id=130126
留言列表