1. 程式人生 > >正則表示式總結(JavaScript、python、PHP、golang、C++、java、C#)之彙總

正則表示式總結(JavaScript、python、PHP、golang、C++、java、C#)之彙總

第一種: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')];