正則表示式總結(JavaScript、python、PHP、golang、C++、java、C#)之彙總
阿新 • • 發佈:2019-01-07
第一種:JavaScript(ES6)
A:分隔符:
例如:reg=/\d(.)\1/g (切記:不能帶單引號和雙引號)
X:ES6之新規則:s 修飾符:dotAll 模式
正則表示式中,點(.
)是一個特殊字元,代表任意的單個字元,但是行終止符(line terminator character)除外。
以下四個字元屬於”行終止符“。
- U+000A 換行符(
\n
) - U+000D 回車符(
\r
) - U+2028 行分隔符(line separator)
- U+2029 段分隔符(paragraph separator)
所以引入/s
修飾符,使得.
可以匹配任意單個字元。
X:ES6之新規則:ES6新增 之命名捕獲(具名組匹配)和反向引用命名捕獲的規則!
//ES6新增 之命名捕獲(具名組匹配)和反向引用命名捕獲的規則! let str = "2019-2019-2019-2019"; //不給分組起別名 let reg = /(\d{4})-(\d{2})-(\d{2})/; //命名捕獲的格式:?<組別名> //反向引用命名捕獲組格式:\k<組名> 或\1...n //這裡的k<year> 等價於(?<year>\d{4}) 也等價於\1 let reg = /(?<year>\d{4})-\k<year>-\1/; //String字串類中的match方法(正則後面不能帶g,否則無法查詢分組模式,詳情查詢官方文件) console.log( str.match(reg) ); console.log( str.match(reg).groups); //注意這裡的groups不是一個函式! //輸出為: /** * (2) ["2019-2019-2019", "2019", index: 0, input: "2019-2019-2019-2019", groups: {…}] 0: "2019-2019-2019" 1: "2019" groups: {year: "2019"} index: 0 input: "2019-2019-2019-2019" length: 2 __proto__: Array(0) */
B:分組替換模式
字串替換:replace(r"(.)\1",r"\1",ss)用$0...n訪問子組,其中$0代表完全代表完整的模式匹配文字! 函式替換:函式引數($0,$1...$n) //JavaScript中的 replace分組替換方法! let str = "2019-01-07-59"; //不給分組起別名 // let reg = /(\d{4})-(\d{2})-(\d{2})/; //命名捕獲的格式:?<組別名> //反向引用命名捕獲組格式:\k<組名> 或\1...n let reg = /(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/; //String字串類中的replace方法(引數為回撥函式)等價於str.replace; reg[Symbol.replace](str, ($,$0,$1,$2) => { console.log($,$0,$1,$2); //輸出結果為:2019-01-07 2019 01 07 }); //$,$0...n的引數也可以用ES6的擴充套件運算子...來接收更方便 reg[Symbol.replace](str, (...args) => { console.log(...args); //輸出結果為:2019-01-07 2019 01 07 0 2019-01-07-59 {y: "2019", m: "01", d: "07"} }); //String字串類中的replace方法(引數為字串) //這裡注意:replace如何替換時引數是字串,ES6中用的是$1...n , python,引用用\1...n 這點和python不一樣!! //等價於reg[Symbol.replace](str,newStr)方法 console.log( str.replace(reg,"$1")); //輸出結果為:2019-59 把整個匹配結果替換為$1
C:分組查詢模式:(match正則後不能帶g,否則無法顯示分組的結果!)
ES6支援分組命名捕獲格式: ?<別名> (非常重要,自動轉換成json格式了)
//ES6中的match查詢匹配使用
let str = "2019-01-07";
//不給分組起別名
let reg = /(\d{4})-(\d{2})-(\d{2})/;
//給分組起別名的格式:?<別名>
let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
//String字串類中的match方法(正則後面不能帶g,否則無法查詢分組模式,詳情查詢官方文件)
console.log( str.match(reg) );
console.log( str.match(reg).groups() );
//RegExp類中的regexp[Symbol.match](str)方法,等價於//String字串類中的match方法!
console.log( reg[Symbol.match](str) );
console.log( reg[Symbol.match](str).groups() );
/**
* (4) ["2019-01-07", "2019", "01", "07", index: 0, input: "2019-01-07", groups: {…}]
0: "2019-01-07"
1: "2019"
2: "01"
3: "07"
groups: {year: "2019", month: "01", day: "07"}
index: 0
input: "2019-01-07"
length: 4
__proto__: Array(0)
*/
第二種:python正則表示式:
A:分隔符
例如:reg=r'\d(.)\1'或r"\d(.)\1",
r代表原始字串。因為沒有//來包裹,如果不加r的話,\1必須加上\\1才可以轉義。
如:reg="\d(.)\\1",建議用r原始字串方式
B:分組替換模式
核心要點:字串替換:re.sub(r"(.)\1",r"\1",ss)用\0....n訪問子組,\0代表完全代表完整的模式匹配文字
函式替換:函式引數為一個元組
#python中的字串查詢匹配分組常用方法!
#re.match(必須從第一個字元開始匹配) 和 re.search(僅匹配第一個位置) 這兩個查詢匹配方法用的少!
#re.match和re.search返回的是一個match物件,裡邊也有group和groups方法
#re.findall(查詢匹配最常用的方法)
import re;
ss = "2019-01-07"
reg = r"(\d{4})-(\d{2})-(\d{2})"
#sub引數為回撥函式的情況:
def replace(matchobj):
print(matchobj.groups()) #輸出結果為:('2019', '01', '07')
re.sub(reg,replace,ss)
#sub引數為字串的情況:
#把reg匹配的結果整體替換成\1(值為2019)
#這裡注意:sub為字串替換時,引用用\1...n 這點和JavaScript不一樣,ES6中用的是$1...n!!
print( re.sub(reg,r"\1",ss)) #結果為2019。
C:查詢替換模式
#python中的字串查詢匹配分組常用方法!
#re.match(必須從第一個字元開始匹配) 和 re.search(僅匹配第一個位置) 這兩個查詢匹配方法用的少!
#re.match和re.search返回的是一個match物件,裡邊也有group和groups方法
#re.findall(查詢匹配最常用的方法)
import re;
ss = "2019-01-07"
reg = r"(\d{4})-(\d{2})-(\d{2})"
print( re.findall(reg,ss) ) #輸出結果為:[('2019', '01', '07')];