日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则表达式(入门)

發(fā)布時間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式(入门) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

定錨點,去噪點,取數(shù)據(jù)

1、入門:正則字符

關(guān)于正則字符,很多文章都會講到,足足有一篇文章才能描述清楚,我這里就不多說,對于我,平時,常用的有:

  • .?匹配不包括換行的任意字符,在php的s修飾符下面可以匹配換行,如$pattern='#<div>(.*?)</div>#s';就可以匹配div內(nèi)容有換行的數(shù)據(jù)。
  • \s?空格、tab

  • *?匹配零個或多個

  • +?匹配一個或多個,即至少一個

  • \?轉(zhuǎn)義

    一個特殊字符前加\就表示轉(zhuǎn)義,說明把它當普通字符用

  • []?單字符取一個,比如[abc]會匹配a或b或c

    但是,如果[]里面加上^則會變成排除這個字符,如[^abc]就表示不是a、不是b、也不是c?
    另外,在[]里面可以使用-表示一個范圍,如[0-9]表示從0到9,類似的還有[a-zA-Z],如果要包含-字符,可以給它加上轉(zhuǎn)義[\-]

  • ^?一行字符串開始(虛擬字符,不實際存在)

    這里的^跟[]里面用的^是同一個字符,但是卻不是一個意思,這里它表示一行字符串的開始,比如^www表示以www開頭的字符串,注意區(qū)分,不在[]里面的是開始符,在里面的排除

  • $?一行字符串結(jié)束(虛擬字符,不實際存在)

  • {1,3}?循環(huán)次數(shù)

    [0-9]{1,3}表示在0-9的范圍里面循環(huán)1個、2個或者3個,可能結(jié)果有5、20、415等

  • ??有兩個用法

    (1) 匹配一個或零個,比如https?匹配的https(一個s)或者http(零個s)

    (2)非貪婪模式

    所謂非貪婪模式,就是匹配盡可能少的內(nèi)容,比如,對于源字符串

  • <div>
  • a
  • </div>
  • <div>
  • b
  • </div>
  • 使用<div>(.*?)</div>會得到2個結(jié)果:

  • <div>
  • a
  • </div>
  • <div>
  • b
  • </div>
  • 因為,當遇到第一個</div>,非貪婪模式就不會再往后找了。?
    而使用<div>(.*)</div>(貪婪模式)則會得到整個字符串

  • <div>
  • a
  • </div>
  • <div>
  • b
  • </div>
  • ,因為它會匹配所有字符直到后面再找不到</div>。?
    11.?|?多個數(shù)據(jù)選一(常用于多字符)?
    前面提到[]里面的字符有選一個字符功能,但是假如不是一個字符,比如:http|ftp|svn 就需要用|分開,|的作用域是一直往后直到遇到括號,比如,對于源字符串

  • http abc
  • ftp abc
  • svn abc
  • http|ftp|svn abc匹配的結(jié)果是:

  • http
  • ftp
  • svn abc
  • 想要匹配?http abc和ftp abc和svn abc就要使用括號把前邊的協(xié)議括起來,如(http|ftp|svn) abc?可以得到預(yù)期的結(jié)果。?
    12.?()?數(shù)據(jù)分界和取數(shù)據(jù)

    上面例子(http|ftp|svn) abc就是數(shù)據(jù)分界的例子,然后,匹配結(jié)果會得到一個[1]的子集數(shù)據(jù),這里就是子模式的概念,利用子模式,可以得到想要取出來的數(shù)據(jù)。子模式1、2、3的計算方法為左括號的計數(shù),從左到右,從1開始,比如:?(http|ftp|svn)://([^/]+),[1]得到的是(http|ftp|svn)里面的數(shù)據(jù),[2]得到([^/]+)里面的數(shù)據(jù),對于嵌套括號也是點左括號即可。?
    13.?(?:)?非捕獲組?
    上面說到()作為子模式可以得到它里面的數(shù)據(jù),但是,有些時候,()只是作為數(shù)據(jù)分界功能,并不需要取出來,這時候就要用到非捕獲組的概念了。比如:(http|ftp|svn)://([^/]+)只想得到域名,也就是[2],那么(http|ftp|svn)就只是數(shù)據(jù)分界的功能,這里不需要捕獲,因此使用非捕獲組功能,(?:http|ftp|svn)屏蔽這部分的數(shù)據(jù)獲取,此時,(?:這個左括號要排除出[1]、[2]計數(shù),也就是(?:http|ftp|svn)://([^/]+)中的([^/]+)變成[1]了。


    關(guān)于常用字符的使用差不多到這里,還有更多的請參考正則表達式30分鐘入門教程,這是我看過比較全面的正則入門資料。

    2、 操作:定錨點

    每一個正則都是有針對性的,只有這樣正則才有意義。因此,寫正則之前,先觀察你要解析的數(shù)據(jù),找準唯一的錨點,比如,你要解析一個頁面的title標簽,得到title內(nèi)容,那么這個title就是錨點。有時候,所要取的數(shù)據(jù)確實無法定位一個唯一的錨點,那么,你可以分解數(shù)據(jù),先通過一個唯一錨點鎖定你的數(shù)據(jù)塊,取出來之后,再對這個數(shù)據(jù)塊取數(shù)據(jù)即可。比如,有這么一段源字符串:

  • <div id="module_1">
  • <div class="content">
  • content 1
  • </div>
  • </div>
  • <div id="module_2">
  • <div class="content">
  • content 2
  • </div>
  • </div>
  • 你直接通過class="content"來匹配數(shù)據(jù)的話很明顯會得到兩個,那么,你可以擴展它的數(shù)據(jù)域,先以id="module_1"作為錨點,獲取整個

  • <div id="module_1">
  • <div class="content">
  • content 1
  • </div>
  • </div>
  • 然后在對這個數(shù)據(jù)塊的數(shù)據(jù)處理,得到class="contents"的內(nèi)容即可。?
    因此,這里用到2個正則:

    (1)<div id="module_1">(.*?)</div>\s*<div id="module_2">?
    (2)<div class="content">(.*?)</div>

    總結(jié):錨點,就是能唯一定位你數(shù)據(jù)的標識

    3、 操作:去噪點

    所謂去噪點,就是把無關(guān)的東西都當浮云,用通配符過掉它,只關(guān)心我們想要的數(shù)據(jù),比如:?<meta content="text/html; charset=utf-8" http-equiv="content-type">?
    要從這里得到字符集utf-8,我們需要怎么做??
    首先,定位錨點,有<meta?、charset=和utf-8后面的",其他都是浮云~?
    因此得到正則:?<meta[^>]*charset=([^"]+)"?
    即可,用子模式取數(shù)據(jù)[1]就能得到utf-8

    總結(jié):關(guān)心的留下,不關(guān)心的都是浮云

    4、 操作:取數(shù)據(jù)

    關(guān)于取數(shù)據(jù),上面一大篇下來大家應(yīng)該有概念了,就是利用子模式來獲取,這里不再贅述。

    總結(jié):子模式計數(shù),數(shù)左括號從1開始,排除非捕獲組的左括號

    總結(jié)

    以上是生活随笔為你收集整理的正则表达式(入门)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。