魔劍工舖

關於部落格
RPG製作大師XP腳本為主要更新

RPG製作大師VX腳本為其次更新

RPG製作大師VX_Ace目前不考慮

RPG製作大師MV腳本完全沒打算

留言完建議重新整理看看是否顯示

目前不處理本舖外腳本的相關問題

其他相關事項請觀看規定注意事項

本舖未來的經營計畫與VA的支援




var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-37462754-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

  • 296198

    累積人氣

  • 10

    今日人氣

    0

    訂閱人氣

正則表達式


正則表達式的匹配方法
正則表達式表示法,和字符串類似,是被 / 符號包圍住的內容為正則表達式
(XP的腳本編輯器不太會分辨,顏色標示有時會當成除法來標示顏色,但不影響實用使用狀況)
使用範例:/魔劍工舖/
正則表達式最主要的功能,就是找尋字符串中指定的內容是否符合或是取出來使用
要拿正則匹配字符串的方式有很多,通常最多都是用「正則表達式 =~ 字符串」較多
p /abcdef/ =~ 'abcdef' #=> 0
p /def/ =~ 'abcdef' #=> 3
p /abcdef/ =~ 'abcdeg'
#=> nil
使用了=~之後,就會開始匹配,就會開始1個字1個字互相對照,看看是否一樣
如果字符串經過正則表達式對照後相同和話,表示匹配成功,會返回一個數值
如果對照發現不一樣的地方之時(例如上面第3行的範例最後1個英文字不同),就返回nil
返回nil就表示匹配失敗了...
那第2行範例怎會匹配成功??不是不一樣嗎??其實匹配並不會完全依照位置來匹配
當匹配成功之時,返回的數值表示在第幾個字節開始匹配成功
由第2行的範例可以看出,在abc三個英文對照失敗,然後def這3個英文是有成功匹配的
由於是在第3個英文字匹配成功的,所以返回的數值為3
此外要注意一點,英文、數字那些半型符號通常是1字節,但是...
像是中文或是其他全型符號,可能1個字會代表3個字節,請特別注意
 
p /舖/ =~ '魔劍工舖' #=> 9
 
還有一種用法是「正則表達式 === 字符串」,這2種用法其實沒差多少,只是返回的不一樣而已
一定要3個等於才成立,如果只有2個等於
那就會變成:正則表達式abcdef 相等 正則表達式abcdef 就返回真(true)
字符串不能說和正則表達式一樣,所以通常都是返回偽(false)
但如果拿正則表達式和正則表達式進行 === 的話,通常也是返回偽(false)(用在=~上則會出錯)
p /abcdef/ === 'abcdef' #=> true
p /def/ === 'abcdef' #=> true
p /abcdef/ === 'abcdeg' #=> false
p /abcdef/ == /abcdef/ #=> true
p /abcdef/ == 'abcdef' #=> false
p /abcdef/ === /abcdef/
#=> false
通常...只要是=~能匹配成功的,===通常都是返回真(true)
如果是用=~會匹配失敗的,那===通常是返回偽(false)
 
 
匹配多種字的方式 UP!!
以上教的那些其實和直接用「字符串 == 字符串」其實也不會差不到哪裡去...
但是接下來教的就有點不太一樣了,就能知道正則表達式的強大了!!
假設要弄個條件分歧,現在有個字符串變量存著 'sword數值'
字符串中的「數值」兩字如果是0到9的任何一個數值時,該怎麼表示條件相等
可能有些人會這樣做...
if 字符串變量 == 'sword0' or 字符串變量 == 'sword1' or 字符串變量 == 'sword2' or
字符串變量 == 'sword3' or 字符串變量 == 'sword4' or 字符串變量 == 'sword5' or
字符串變量 == 'sword6' or 字符串變量 == 'sword7' or 字符串變量 == 'sword8' or
字符串變量 == 'sword9'
  # 執行內容
end
不然就是...
for i in 0..9 # 循環並分別在變量i中代入0到9的數值
  if 字符串變量 == "sword#{i}" # 字符串在用 " 符號表示,可用「#{變量名}」將字串組合
    # 執行內容
  end
end
但不管是哪一個,不但內容多又佔版面、容量還有運行速度(要設很多才會影響到速度)
但實際上用正則表達式的話,只要...
if (/sword[0-9]/ =~ 字符串變量) == 0
  # 執行內容
end
是不是簡潔有力,順便解釋一下好了,先說明一下 [ ] 框框的效果
[ ]有點類似or(或)的功能,例如你寫[Aa],則這個字如果是A或是a都會視同匹配成功
而 - 這個符號有點類似範圍表示把(0..9之類的),所以[0-9]代表0到9
/[3-8]/ 代表3到8,/[a - f]/ 代表a到f(依照英文的順序而定)
所以你用 /[4-8]//[45678]/ 在不然就是 /[57864]/ ,匹配的內容都是相同的!!
此外也能將 /[4-8]//[45678]/ 混著使用,例如像是 /[1234-789]/ /[0-9]/ 的匹配也是相同的!
所以可以知道,sword[0-9]就是「sword這裡1到9的數字都能匹配成功
最右邊的「== 0」表示結果如果相等0的話就返回真
在上面有介紹過用=~匹配成功會返回1個數值,這個數值表示從第幾個字節開始匹配成功
所以「== 0」就可以想成:從開頭開始都有匹配成功的話就返回真!!
不加「== 0」的話,字符串如果是 'asword8' ,結果還是會傻傻的判定真而執行
(提醒:除了false和nil之外的東西都是代表真,if 條件分歧必須在真的情況下才會執行)
注意:如果有加「== 0」,則正則表達式的匹配過程必須用()框起來,不然會出現錯誤
(大概是兩個都是屬於比較類型的方法,這樣放系統搞不清楚誰比較誰吧,這是猜測)
除了使用 [ ] 來指定可匹配的範圍之外,繼續往下看的話,能看到其他種指定方式
例如:^為匹配開頭、w可以匹配除了符號和控制碼的內容...等等  
p /[37]/ =~ '3' #=> 0
p /[37]/ =~ '7' #=> 0
p /[37]/ =~ '4' #=> nil
p /[a-x]/ =~ 'h' #=> 0
p /[a-x]/ =~ 'y'
#=> nil
 
 
匹配相同類型的全部內容
上面有說是過,正則匹配字串,是1個字1個字對照的
但是當有相同類型的內容時,但是字數卻不對要怎辦??,例如有個字符串為 'abc123def'
假設中間的「123」這3個數字都會變、
而但位數也會變得話(你可以把123想成是0~1000的隨機數好了),那要怎表示??
if (/abc[0-9][0-9][0-9]def/ =~ 'abc123def') == 0
  # 執行內容
end
這樣可行是可行,但是題目說位數會變,所以有時冒出十位或是千位的數字不就失敗了?
所以可以用 + 這個符號來解決這個問題
if (/abc[0-9]+def/ =~ 'abc81641321653def') == 0
  # 執行內容
end
符號 + 的功能,會依據+左邊的內容決定類型(範例中 + 左邊是 [0-9],所以類型就是[0-9]
接著開始繼續對照,如果下一個字一樣能用[0-9]匹配掉的話,則就繼續
就這樣不斷重複,直到無法透過[0-9]或是到打字串尾部時才停止,繼續匹配剩下的 /def/ 
所以以上範例中,[0-9]+匹配掉了字符串的81641321653 
 
 
獲取字符串中指定的內容
可以使用( ) 來獲取字符串中指定的內容,例如:
/abcd([0-9]+)ef/ =~ 'abcd58841ef'
p $1 #=> "58841"
/a([0-9]+)bcde([0-9]+)f/ =~ 'a584bcde1195f'
p $1 #=> "584"
p $2 #=> "1195"
p $3
#=> nil
當匹配成功時,被 ( ) 包圍住內的正則表達式匹配到的內容,將會存在系統變量中
第1個 ( ) 內的正則表達式匹配到的內容會存在變量$1中,第2個 ( ) 就存在$2,就這樣依此類推
通常這些變量的值只會保留到下次匹配時,下次匹配會將這些變量全數清空
並再次從$1、$2、$3...等等順序這樣開始存
/魔(劍)工舖/ =~ '魔劍工舖'
p $1 #=> "劍"
/魔劍工舖/ =~ '魔劍工舖'
p $1 #=> nil(將舊的匹配內容清除了,所以為nil,nil代表空的意思)
 
 
內鑲表達式
在用雙引號(")定義字符串時,我們可以在字符串內寫「#{變量名稱}
則就會將內容「#{變量名稱}」變更為這個變量的值
而正則表達式也可以使用內鑲表達式,使用方法和字符串相同
a = '魔劍'
p "#{a}工舖" #=> "魔劍工舖"

a = /劍/
p /魔#{a}工舖/ =~ '魔劍工舖'
#=> 0(同:/魔劍工舖/ =~ '魔劍工舖')
 
 
匹配有效果的內容
在繼續往下看的話,會看到有些符號或是加了符號的英文都有特殊的匹配效果
例如我們想匹配掉 / 符號 ,但是系統很有可能會誤判成正則表達式結束
或是想要將以下看到的那些有特殊匹配效果的符號給匹配掉時,該怎麼做呢??
這時就可以在左邊加上符號,則就會被當成是單純要匹配的內容了!!
p /// =~ '/' #=> 0
p /[]/ =~ '[]' #=> 0
p /[[0-5]]/ =~ '[4]' #=> 0
p /\d/ =~ '\d'
#=> 0
  
 
^ 
p /^/ =~ '魔劍工舖' #=> 0
p /^魔劍工舖/ =~ '魔劍工舖' #=> 0
p /魔劍^工舖/ =~ '魔劍工舖' #=> nil
p /魔劍工舖^/ =~ '魔劍工舖' #=> nil
p /魔劍工^舖/ =~ "魔劍工n舖" #=> nil
p /魔劍工n^舖/ =~ "魔劍工n舖" #=> 0
p /魔劍工n舖^/ =~ "魔劍工n舖" #=> nil

/(^)魔劍工舖/ =~ '魔劍工舖'
p $1 #=> ""
# 字符串的gsub方法,將指定正則匹配到的內容修改成指定的內容
# 使用法:存著字符串的變量.gsub(/正則表達式/, '修改成的字符串')
p "魔劍工舖".gsub(/^/, '★') #=> "★魔劍工舖"
p "魔劍n工舖".gsub(/^/, '★')
#=> "★魔劍n★工舖"
匹配該行的開頭,也可以想像成^代表為該行開頭的位置
依據以上範例2中的測試結果,用( )嘗試獲取^匹配到的內容,發現是空的字符串!!
所以^不代表任何一個字,就是匹配開頭的空...就是了(很深奧的解釋)
在字符串採用雙引號的情況下輸入「n」控制碼,這個控制碼代表為換行的意思
所以^匹配該行的開頭,所以在字符串「n」開始之後也能使用^匹配到!!
 
$
p /$/ =~ '魔劍工舖' #=> 12
p /$魔劍工舖/ =~ '魔劍工舖' #=> nil
p /魔劍$工舖/ =~ '魔劍工舖' #=> nil
p /魔劍工舖$/ =~ '魔劍工舖' #=> 0
p /魔劍工$舖/ =~ "魔劍工n舖" #=> nil
p /魔劍工n$舖/ =~ "魔劍工n舖" #=> nil
p /魔劍工n舖$/ =~ "魔劍工n舖" #=> 0
/魔劍工舖($)/ =~ '魔劍工舖'
p $1 #=> ""
p "魔劍工舖".gsub(/$/, '★') #=> "魔劍工舖★"
p "魔劍n工舖".gsub(/$/, '★')
#=> "魔劍★n工舖★"
匹配該行的尾部,基本上這個和^是大同小異,^匹配該行開頭,$匹配該行結尾
所以就不多做介紹了,請參考^的內容
稍微提醒一下,你在以上範例1中的第1行的測試
返回值為12,表示在第12個字節匹配到符合的字串,也就是尾部的位置(中文1個字為3字節)  
 
.
p /.魔劍工舖/ =~ '魔劍工舖' #=> nil
p /魔.工舖/ =~ '魔劍工舖' #=> 0
/魔劍(.)舖/ =~ '魔劍工舖'
p $1
#=> "工"
/魔劍(.)舖/ =~ '魔劍n舖'
p $1 #=> nil(匹配失敗,所以沒有存到系統變量中)
p "魔劍n工舖".gsub(/./, '★')
#=> "★★n★★"
匹配換行符以外的任何內容,也可以說是不包含控制碼「n」的其他內容都可以匹配
 
w
p "魔#劍n工 舖".gsub(/w/, '★') #=> "★#★n★ ★"
匹配任何數字、大小寫英文、下劃線(_)、還有其他全型字(含中文)
所以下劃線以外的符號或是一些控制碼通常都不會被匹配
 
W
p "魔#劍n工 舖".gsub(/W/, '★') #=> "魔★劍★工★舖"
匹配除了數字、大小寫英文、下劃線(_)、其他全型字(含中文)以外的內容
也就是說,W就是匹配:w不能匹配的內容  
 
s
p "f魔 劍n工00舖v".gsub(/s/, '★') #=> "★魔★劍★工00舖★"
p "f魔 劍n工00舖v".gsub(/[ tnrfv]/, '★')
#=> "★魔★劍★工00舖★"
匹配空格( )、製表符(t)、換行符(n)、回車符(r)、換頁符(f)、垂直製表符(v)
效果同:[ tnrfv]
範例中,00(8進位)雖然是控制碼,但不屬於上述那些符,所以不會被匹配掉
 
S
p "f魔 劍n工00舖v".gsub(/S/, '★') #=> "f★ ★n★★★v"
匹配除了空格( )、製表符(t)、換行符(n)、回車符(r)、換頁符(f)、垂直製表符(v)的內容
也就是說,S就是匹配:s不能匹配的內容  
 
d
p "魔510劍7工85舖".gsub(/d/, '★') #=> "魔★★★劍★工★★舖"
p "魔510劍7工85舖".gsub(/[0-9]/, '★')
#=> "魔★★★劍★工★★舖"
匹配數字,效果同:[0-9]  
 
D
p "魔510劍7工85舖".gsub(/D/, '★') #=> "★510★7★85★"
匹配除了數字以外的內容,也就是說,D就是匹配:d不能匹配的內容  
 
A
p "魔劍n工舖".gsub(/A/, '★') #=> "★魔劍n工舖"
匹配字符串的頭部,和^不同在於,就算換行(n)後,換行的開頭也不會被A匹配到
 
Z
p "魔劍n工舖".gsub(/Z/, '★') #=> "魔劍n工舖★"
p "魔劍工舖n".gsub(/Z/, '★')
#=> "魔劍工舖★n★"
匹配字符串的尾部,和$不同在於,就算換行(n)後,換行部分不會被Z匹配到
但是如果最後的內容是換行符時,則最後的換行符前後都會匹配到...
 
z
p "魔劍n工舖".gsub(/z/, '★') #=> "魔劍n工舖★"
p "魔劍工舖n".gsub(/z/, '★')
#=> "魔劍工舖n★"
匹配字符串的尾部,和$不同在於,就算換行(n)後,換行部分不會被視為結尾
和Z的不同在於少了「最後1個字如果是換行符時的情況」,所以一律添加到最後面...
 
b
p "魔劍工舖".gsub(/工舖b/, '★') #=> "魔劍★"
p "魔劍工舖".gsub(/魔劍b/, '★') #=> "魔劍工舖"
p "魔劍 工舖".gsub(/魔劍b/, '★') #=> "★ 工舖"
p "魔劍 工舖".gsub(/ b/, '★') #=> "魔劍★工舖"
p "魔劍fn工舖".gsub(/fb/, '★') #=> "魔劍fn工舖"
p "魔劍fn工舖".gsub(/nb/, '★')
#=> "魔劍f★工舖"
匹配單詞邊界,這個就有些深奧的,用法差不多就是這樣「內容b
假設內容能用w匹配掉的話,則下個字遇到不能被w匹配掉的內容時就匹配內容成功!!
但如果下個字遇到的是被w匹配掉的內容,則視同匹配失敗...(我真的不知道該怎解釋...)
相反的,內容是能用W匹配掉的話,則下個字不能用W匹配掉表示成功,被W匹配調為失敗
也就是說,當字串「'魔劍n工舖'」,正則為「/劍b/」時
「劍」這個字是能用w匹配掉的,但是下一個字是「n」,這個則必須用W匹配掉
所以成功匹配了,成功匹配到了「劍」這個字
但是如果把字串中的「n」去掉的話:
「劍」這個字是能用w匹配掉的,但是下一個字是「工」,這一樣能用w匹配掉的內容
所以匹配失敗...(就像以上範例那樣,結果沒有出現星符號的都是匹配失敗的!!)
簡單來說,遇到相同的匹配方式就匹配失敗,不相同的匹配方式就匹配成功這樣...
通常只有用W和w來比較看看是否類型相同...
(聽不懂沒關係,因該是不會很常用到才是...)  
 
B
p "魔劍工舖".gsub(/工舖b/, '★') #=> "魔劍工舖"
p "魔劍工舖".gsub(/魔劍b/, '★') #=> "★工舖"
p "魔劍 工舖".gsub(/魔劍b/, '★') #=> "魔劍 工舖"
p "魔劍 工舖".gsub(/ b/, '★') #=> "魔劍 工舖"
p "魔劍fn工舖".gsub(/fb/, '★') #=> "魔劍★n工舖"
p "魔劍fn工舖".gsub(/nb/, '★')
#=> "魔劍fn工舖"
匹配非單詞邊界,仔細對照看看b的範例,會發現在b匹配失敗的這裡都能匹配成功
有此可見B是b的相反效果
簡單來說,遇到相同的匹配方式就匹配成功,不相同的匹配方式就匹配失敗這樣...  
 
c
p /c1/ =~ "21" #=> 0
p /c2/ =~ "22" #=> 0
p /c2/ =~ "23" #=> nil
p /cJ/ =~ "n"  #=> 0
p /cL/ =~ "f"
#=> 0
紅色字的「」可以設定是數字、大小寫英文,通常你指定的值代表1個控制碼(大概)
主要是採用ASCII編碼的控制字元(慘了,完全不知道要怎說明...)
總之...除了直接使用n、f之類的控制碼放在正則表達式匹配字符串的控制碼之外
這個其實也能代替這些控制碼的使用(只不過要知道「」是多少而已)
 
[內容] UP!!
p /魔劍工舖[15]/ =~ '魔劍工舖1' #=> 0
p /魔劍工舖[15]/ =~ '魔劍工舖5' #=> 0
p /魔劍工舖[15]/ =~ '魔劍工舖3' #=> nil
p /魔劍工舖[1-5]/ =~ '魔劍工舖3' #=> 0
p /魔劍工舖[1-5]/ =~ '魔劍工舖0'
#=> nil
指定字符簇,也就是一開始介紹的[0-9][abc]這些被 [ ] 框起來的內容為字符簇
在 [ ] 內使用 - 符號表示範圍(也就是幾到幾),例如[1-9]就是1到9任一個數值
用在英文上也可以,例如[f-h],則代表f、g、h這3個英文都能匹配(依照英文的順序)
效果很類似or(或),[5-8]就代表這個可以匹配5、6、7、8任何一個
[de6wx-zr]就表示能匹配d、e、6、w、 x、 y、 z、 r中任何一個字
如果字符簇是空的,例如 /[]/ 或是 /[^]/ 之類的都會發生錯誤(^實際獲取的是空,詳細請看^的內容)  
此外如果順序放反了,會出現錯誤,例如 /[z-a]/ 或是 /[9-0]/ 都會出現錯諸
 
(內容)
/魔劍(d+)工舖/ =~ '魔77劍1325工46舖'
p $1 #=> "1325"
/魔(d+)劍(d+)工(d+)舖/ =~ '魔77劍1325工46舖'
p $1 #=> "77"
p $2 #=> "1325"
p $3
#=> "46"
p $4 #=> nil
正則表達式群組化,當匹配成功時,被 ( ) 包圍住而匹配掉的內容會存在系統變量中
系統變量分別是$1、$2、$3、$4...等等依此類推
這個在上面也已經介紹過了,1個正則( )設越多,則就系統變量就會跟著存越多
直到下此匹配時,系統變量才會變回nil或是顯示新被( )框起來的匹配內容
 
(?#內容)
p /魔劍(?#123)工舖/ =~ '魔劍工舖' #=> 0
p /魔劍工舖/ =~ '魔劍工舖' #=> 0
p /魔劍(?#123)工舖/ =~ '魔劍123工舖' #=> nil
p /魔劍工舖/ =~ '魔劍123工舖' #=> nil
p /(?#信箱帳號)([A-Za-z0-9]+)@(?#信箱位址)yahoo.com/ =~ 'sword@yahoo.com'
#=> 0
被框住的內容為註釋忽略不執行,簡單來說有放跟沒放效果是一樣的
這個主要的功用在於標示或是說明(給設計者看)之用,效果同腳本的 # 符號的註釋效果
不過基本上大部分的人不會在正則表達式中用註釋才是,除非是很深奧的正則部份...
 
(?:內容)
/魔(劍)工舖/ =~ '魔劍工舖'
p $1 #=> "劍"
/魔(?:劍)工舖/ =~ '魔劍工舖'
p $1
#=> nil
正則表達式群組化,和( )不同的是,這個不會提供後向引用的功能
也就是匹配成功時,被(?: )匹配到的內容不會存在系統變量($1、$2...等)中
(這樣感覺就像沒加一樣,我也不清楚這有什麼用...)  
 
|
p "魔劍工舖".gsub(/劍|工/, '★') #=> "魔★★舖"
p "魔劍工舖".gsub(/魔劍|工舖/, '★') #=> "★★"
p "魔劍工舖".gsub(/工舖|魔劍/, '★') #=> "★★"
p "劍魔工舖".gsub(/魔|劍工舖/, '★') #=> "劍★工舖"
p "劍工舖魔魔".gsub(/魔|劍工舖/, '★')
#=> "★★★"
分割正則的匹配方式,這個有點類似字符簇([ ])的特性
例如我們知道這樣寫/[ac]/會匹配a或是c,而這樣寫/a|c/,效果也差不多...
但是和 [ ] 最大的不同是,這個會以整個正則表達式來分割
不像 [ ] 用 [ 表示開始,用 ] 表示結束,所以用 | 可以想成是將正則全用 [ ] 框起來
你看到以上第5行的範例,正則表達式是指定/魔|劍工舖/
所以代表匹配「魔」這1個字或是「劍工舖」這3個字,所以返回3個星就知道原因了吧
 
G NEW
p "魔劍工舖".gsub(/Gww/, '★') #=> "★★"
p "魔劍 工舖".gsub(/Gww/, '★') #=> "★ 工舖"
p "魔劍 n工舖".gsub(/Gww/, '★') #=> "★ n工舖"
p "魔劍工 舖".gsub(/Gw/, '★') #=> "★★★ 舖"
p "魔劍工舖".gsub(/wGw/, '★')
#=> "魔劍工舖"

p /wGw/ =~ '魔劍工舖' #=> nil
p /GwGw/ =~ '魔劍工舖'
#=> nil
G左邊不能有其他匹配的內容,不然都會匹配失敗(可能有誤,等人證實好了@@)
這個有點類似 + 符號的功能,用法差不多就是「/G內容/
匹配指定的內容之後,如果有成功匹配,則就在次使用相同的正則表達式再次匹配
例如有個字符串的內容是'123456a789',正則表達式為/Gdd/
首先一開始會用「dd」匹配掉字符串的「12」,匹配成功,所以在1次!!
在繼續用「dd」匹配掉字符串的「34」,匹配成功,所以在1次!!
「dd」匹配掉「56」成功,在1次,拿「dd」匹配「a7」,a沒辦法被d給匹配掉
所以在此中斷不再繼續,所以剩下的「89」這2個數字不會被匹配掉!!
 
{數量} NEW
p "魔1劍12工123舖".gsub(/d{1}/, '★') #=> "魔★劍★★工★★★舖"
p "魔1劍12工123舖".gsub(/d/, '★') #=> "魔★劍★★工★★★舖"
p "魔1劍12工123舖".gsub(/d{2}/, '★') #=> "魔1劍★工★3舖"
p "魔1劍12工123舖".gsub(/dd/, '★') #=> "魔1劍★工★3舖"
p "魔1劍12工123舖".gsub(/d{3}/, '★') #=> "魔1劍12工★舖"
p "魔1劍12工123舖".gsub(/ddd/, '★') #=> "魔1劍12工★舖"
p "魔1劍12工123舖".gsub(/d{0}/, '★')
#=> "★魔★1★劍★1★2★工★1★2★3★舖★"
基本上可以說是簡寫,用法為 /內容{數量}/ ,你指定的數量越多,則內容越多
這個就跟你直接拿字符串進行乘法非常的類似!!
p '魔劍工舖' * 4 #=> "魔劍工舖魔劍工舖魔劍工舖魔劍工舖"
所以你輸入/d{4}/ /dddd/(4個d)沒有什麼差別...
附註:如果寫成{0},那就很有可能會改匹配空(每個文字之間的位置,含A和z代表的位置)
 
{數量,} NEW
p "魔1劍12工123舖".gsub(/d{1,}/, '★') #=> "魔★劍★工★舖"
p "魔1劍12工123舖".gsub(/d{2,}/, '★') #=> "魔1劍★工★舖"
p "魔1劍12工123舖".gsub(/d{3,}/, '★') #=> "魔1劍12工★舖"
p "魔1劍12工12345舖".gsub(/d{3,}/, '★') #=> "魔1劍12工★舖"
p "魔1劍12工123舖".gsub(/d{0,}/, '★')
#=> "★魔★★劍★★工★★舖★"
以範例中來說,這個很像是指定條件來觸發「d+」,用法為 /內容{數量,}/
一開始先向{ }一樣,先將內容乘數量,然後嘗試匹配看看,匹配成功的話
之後就不限數量,後面相同類型的都能匹配成功!!
在看看下一個範例吧...
p /d{3,}/ =~ '1' #=> nil
p /d{3,}/ =~ '12' #=> nil
p /d{3,}/ =~ '123' #=> 0

/(d{3})/ =~ '123456789'
p $1 #=> "123"
/(d{3,})/ =~ "123456789"
p $1
#=> "123456789"
看第1行,「d{3,}」可想成3個d,所以可想成拿 /ddd/ 去匹配 '1',結果當然是失敗!!
看到第2行,拿 /ddd/ 去匹配 '12' ,一樣因為要匹配的數量不一而失敗
在看到第3行,拿 /ddd/ 去匹配 '123' ,剛剛好是3個數字,所以匹配成功
從剛剛看到現在似乎和{ }沒什麼差別,但接下來就能看到{ }和{ ,}的差別了!!
看看範例中分隔線下面的內容,這是就用( )來獲取{3}{3,}到底匹配了什麼東西...
{3}確實像用 /(ddd)/ 匹配到的內容,但是{3,}卻匹配到像用 /(d+)/ 匹配的內容!!
這樣是不是很明顯了,就像我上面說的:很像是指定條件來觸發「d+」
所以 /d{3,}/ 就可以想成當:當發現能用「ddd」匹配掉的內容時,就用「d+」把數字匹配掉
附註1:{1,}效果和 + 的效果沒什麼差別
附註2:如果寫成{0,},那就很有可能會改匹配空(每個文字之間的位置,含A和z的位置)
     這就有趣了XD,當空為匹配成功,所以也就是一律觸發條件所以...
     如果這樣寫 /d{0,}/ ,匹配空成功後,就會在空的位置開始用「d+」匹配的可笑用法...
     包含原本的空也有被匹配(但不是d一起匹配),所以結果會冒出2個星星!!(範例1)
 
{數量,最多數量} NEW
p "魔1劍12工123舖".gsub(/d{1,1}/, '★') #=> "魔★劍★★工★★★舖"
p "魔1劍12工123舖".gsub(/d{1,2}/, '★') #=> "魔★劍★工★★舖"
p "魔1劍12工123舖".gsub(/d{1,3}/, '★') #=> "魔★劍★工★舖"
p "魔1劍12工12345舖".gsub(/d{3,}/, '★')
#=> "魔1劍12工★舖"
效果可以說是有限制匹配次數的 + ,用法為 /內容{數量,最大數量}/
「數量」如果指定在2以上(含2),似乎會出現錯誤,看來「數量」限制為0或是1
一開始和{ ,}效果相同,一開始就像分析條件分歧那樣,當符合的場合就用類似 + 的效果
但這樣會一路匹配到不符合類型或是結尾為止,不希望這樣的話,就可以最多匹配的數量
(我知道我說的很深奧,我自己都快看不懂自己在打什麼東西了...)
例如看到第2行範例吧,由於「數量」是1,所以有發現能被 d ,就會嘗試用d匹配看看
一開始成功匹配了'1',所以變成了星符號,接著開始匹配'12'
'1' 能被d匹配掉,但下一個字 '2' 也是能用d,所以一起匹配掉,所以 '12' 變成了星符號
接著匹配到 '123' ,  '1' 能被 d 匹配掉,在檢查下一個字 '2' 也能匹配掉
雖然下一個字 '3' ,可以用 d 匹配掉,但是已經匹配了2個字了,而最多數量已經限制為2了
所以最多只能用 /dd/ 來去匹配,所以只將 '123' 中的 '12' 部分變成星符號
剩下的 '3' 在重新用 /d{1,2}/ 去匹配,所以 '3' 變成了星符號, 所以 '123' 會有2個星符號出現
 
 
全型英文與數字的範圍匹配 NEW
p /[0-9]/ =~ '5' #=> 0
p /[A-Z]/ =~ '5' #=> nil
p /[0-9]/ =~ '5' #=> nil
p /d/ =~ '5' #=> nil(d只限於匹配半型的數字,效果同[0-9]而非[0-90-9])
p /[A-Z]/ =~ 'S' #=> 0
p /[A-Z]/ =~ 'S' #=> nil
p /[A-Z]/ =~ 'S'
#=> nil
其實基本上和半型的範圍差不多,/[0-9]/ 表示全型的數字0到9
差別只在於只能匹配半型還是全型而已,全型英文也是一樣,照英文的順序排列
 
 
如何匹配所有的中文字 NEW
/([一-龥]+)/ =~ '魔劍工舖'
p $1 #=> "魔劍工舖"
/([一-龥]+)/ =~ '魔劍工1舖'
p $1 #=> "魔劍工"
/([一-龥]+)/ =~ '魔剑工铺'
p $1 #=> "魔剑工铺"(簡體中文實驗結果,匹配成功)
p /[一-七]/ =~ '三'
#=> nil(中文的依照方法都是一樣的,不會依照數字順序的!!)
以上有只能匹配數字([0-9])或是只能匹配所有英文([a-zA-Z]
那麼是否可以只匹配中文呢??也就是不包含任何符號、數字、英文、就是匹配中文字
其實只要打開你的字典,這樣寫即可 /[字典的第一個字-字典最後一個字]/
這樣就好了,就是這麼簡單!!,不管是正體(繁體)中文還是簡體中文通常都能匹配到
(我字典最後1個字是「ㄔˊ」,也就是「龠虒」這2個字合在一起的字,但我打不出來...
 所以只好拿「龥」來替代一下,也不確定有沒有比「龠虒」還多部首筆劃的字)

可能有些人有疑問,那中文的範圍順序到底是什麼??
我們知道數字是「123456789」,英文是「abcdefghijklmnopqrstuvwxyz」(大寫也相同順序)
那中文呢??
通常中文字的範圍表示是以部首+部首筆劃的順序排列(不知道是不是UTF-8編碼的緣故?!)
通常情況下,照著字典的順序通常就是中文字的範圍(提醒:不是看注音表喔)
我字典中第1個字為「一」(部首一部0劃),第2個字為「丁」(部首一部1劃)...就像這樣子...
p /[一-万]/ =~ '丁' #=> 0
p /[一-万]/ =~ '万' #=> 0
p /[一-万]/ =~ '丈'
#=> nil
翻一下字典,看看順序,從「一」開始看,看看經過了什麼字之後才看到「万」這個字
我的字典翻的結果看到這些字「一丁七万」,所以 /[一-万]/ 可以匹配一、丁、七、万
而「丈」這個字是「万」的下一個,不再範圍內,所以第3行匹配失敗了!!
 
 
字符簇的其他用法 NEW
/([0-龥]+)/ =~ 'K1f4工eV8魔wfDDw舖f4劍6SFe4魂6d'
p $1 #=> "K1f4工eV8魔wfDDw舖f4劍6SFe4魂6d"
/[0-z]/ =~ '1def46d5ew46' # Error
這樣做的話,數字、大小寫英文,所有中文都能匹配了!!(不會出錯)
但是改成這樣 /[0-z]/ 或是 /[z-0]/ 的話似乎會出錯(錯誤原因不明!!故意錯誤的嗎?!)
所以想要用 /[0-z]/ ,還是只能寫成 /[0-9a-z]/

相簿設定
標籤設定
相簿狀態