正則表達(dá)式

2018-02-24 16:10 更新

有些人在面對問題時,不經(jīng)大腦便認(rèn)為,「我知道,這里該用正則表達(dá)式」?,F(xiàn)在他要面對兩個問題了。
——Jamie Zawinski

  • 如果只需要在字符串中簡單的搜索文字,不要使用正則表達(dá)式:string['text']。

  • 針對簡單的字符串查詢,可以直接在字符串索引中直接使用正則表達(dá)式。

    match = string[/regexp/] # 獲得匹配正則表達(dá)式的內(nèi)容
    first_group = string[/text(grp)/, 1] # 或得分組的內(nèi)容
    string[/text (grp)/, 1] = 'replace' # string => 'text replace'
  • 當(dāng)你不需要替結(jié)果分組時,使用非分組的群組。

    /(first|second)/ # 差
    /(?:first|second)/ # 好
  • 不要使用 Perl 遺風(fēng)的變量來表示捕獲的正則分組(如?$1?、?$2?等),它們看起來神神秘秘的。使用Regexp.last_match[n]。

    /(regexp)/ =~ string
    ...
    
    # 差
    process $1
    
    # 好
    process Regexp.last_match[1]
  • 避免使用數(shù)字來獲取分組。因為很難明白他們代表的意思。應(yīng)該使用命名群組來替代。

    # 差
    /(regexp)/ =~ string
    ...
    process Regexp.last_match[1]
    
    # 好
    /(?<meaningful_var>regexp)/ =~ string
    ...
    process meaningful_var
  • 字符類別只有幾個你需要關(guān)心的特殊字符:^、-、\、],所以你不用轉(zhuǎn)義?[]?中的?.?或中括號。

  • 小心使用?^?與?$?,它們匹配的是一行的開始與結(jié)束,不是字符串的開始與結(jié)束。如果你想要匹配整個字符串,使用\A?與?\z。(譯注:\Z?實為?/\n?\z/,使用?\z?才能匹配到有含新行的字符串的結(jié)束)

    string = "some injection\nusername"
    string[/^username$/] # 匹配
    string[/\Ausername\z/] # 不匹配
  • 針對復(fù)雜的正則表達(dá)式,使用?x?修飾符??商岣呖勺x性并可以加入有用的注釋。只是要注意空白字符會被忽略。

    regexp = %r{
      start # 一些文字
      \s # 空白字元
      (group) # 第一組
      (?:alt1|alt2) # 一些替代方案
      end
    }x
  • 針對復(fù)雜的替換,sub?或?gsub?可以與區(qū)塊或哈希結(jié)合使用。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號