close

 

需要上課的人員:

試題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

這個符號有三種意義,分別是「開始」與「不符合」及代符號^本身;判斷是那一種意義,要視擺放的位置而定,下方為範例:

  1. ^abc → 代表文字開頭為abc,即時^的意義為「開始」。

  2. [^abc] → [ ]的意義為字元,代表這個字元必需符為[ ]內的字元,不過在[ ]裡面的^代表的是「不符合」,所以[^abc]代表這個字元必須不符合abc才行。

  3. 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

 

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()