正規表示式
正規表示式在很多場景都適用。例如,驗證字串是否匹配格式,查詢匹配的字串,替換匹配的字串。
很多程式語言都支援正規表示式,語法也相近。
正規表示式由兩部分組成:模式和匹配字串。
通常我們說的寫乙個正規表示式,就是寫乙個模式。然後驗證一些輸入的字串是否匹配這個模式。
regexp
在ruby中模式叫做regexp。用/.../或者%r(...)包起來的內容就是這個regexp。
例如
/regexp/%r(regexp)
haystack中包含y,所以他們就匹配了。
/y/.match('haystack') #=>
#<
matchdata
"y">
haystack中不包含needle,所以就不匹配,返回nil。
/needle/.match('haystack') #=>
nil
haystack中包含hay,所以就匹配。
/hay/.match('haystack') #=>
#<
matchdata
"hay"
>
metacharacters and escapes
字元(
,)
,[
,]
,,
.
,?
,+
,*
都是元字元,在模式中特殊的含義,如果想要匹配這些字串的,需要在它們前面加上反斜槓\,使得這些特殊字元從模式中escape,代表普通的字元。
3\?/.match('does 1 + 2=
3?') #=
>
#<
matchdata
"1 + 2=
3?">
ruby表示式也可以嵌入到模式中,只要寫在#中就可以。
place= "東京都"
/#/.match("go to 東京都")
#=>
#<
matchdata
"東京都"
>
character classes
用括起來的一些字元,看他們是否在match**現。/[ab]/代表a或b,/ab/代表a後面要跟著b。
/w[aeiou]rd/.match("word") #=>
#<
matchdata
"word"
>
用-連線的兩個字元,代表乙個範圍,[a-d]和[abcd]是乙個意思。
中可以包含多個範圍[a-dx-z]和[abcdxyz]是乙個意思。
/[0-9a-f]/.match('9f') #=>
#<
matchdata
"9">
/[9f]/.match('9f') #=>
#<
matchdata
"9">
^代表相反的意思,就是除了模式中^後面的內容。
/[^a-eg-z]/.match('f') #=>
#<
matchdata
"f">
repetition重複
重複符號可以指明字元重複的次數。
重複預設是貪婪的,它會盡力向後匹配,匹配更多的內容。懶惰匹配只找到最近的匹配字串,只做最少量的匹配。
通過新增?就可以使貪婪變成懶惰。
/<.+
>
/.match("
<
a>
<
b>
") #=
>
#<
matchdata
"<
a>
<
b>
">
/<.+
?>
/.match("
<
a>
<
b>
") #=
>
#<
matchdata
"<
a>
">
ruby 正規表示式Regexp
a 匹配字元a。匹配特殊字元?特殊字元包括 匹配任意字元,例如 a.匹配ab和ac ab c 匹配ac和bc,之間代表範圍。例如 a z a za z0 9 a za z0 9 匹配不在該範圍內的字串 d 代表任意數字 w 代表任意字母,數字或者 s 代表空白字元,包括空格,tab和換行 d w s...
JS正則 RegExp概述
ecmascript通過regexp型別支援正規表示式。格式 let expression pattern flagspattern 模式 flags 標記 說明 所有的元字元在模式中必須轉義 包括 元字元在正規表示式中都有一種或多種特殊功能,所以要匹配上面這些字元本身,就必須使用反斜槓來轉義。示例...
RegExp入門筆記
前言 一開始我是拒絕學正規表示式的,暑假看慕課上的php高階課程裡有一章是專門講正則,然後我思考的幾秒鐘,就略過了。理由和大家一樣,畏懼,聽很多人說正則很難,然後就果斷放棄。但是昨天看到知乎上有個話題,問大家為什麼不喜歡正則,然後看到下面很多大神說正則處理字串很有用,很有用,很有用,甚至有人說正則很...