錙銖必較:程序員生存指南——正則表達式中使用斷言

想讓一個名詞聽起來特別高大上痛悯,最簡單的方法就是加很多修飾語鸵鸥。比如多源異構(gòu)群智協(xié)同負反饋深度神經(jīng)網(wǎng)絡(當然了嵌巷,這是我瞎編的)萄凤。在正則表達式中,有一種東西叫斷言搪哪,它的修飾語也很多:

  1. 零寬正向先行斷言
  2. 零寬負向先行斷言
  3. 零寬正向后行斷言
  4. 零寬負向后行斷言

斷言之所以叫“零寬”蛙卤,是因為它們不會消費字符串,可以理解為斷言匹配的是位置噩死。
斷言之所以叫“斷言”,是因為它們用來產(chǎn)生一個True\False的判定結(jié)果神年。
正向和負向分別指的是“應該出現(xiàn)”和“不應該出現(xiàn)”已维。
先行和后行分別指的是“此位置之后”和“此位置之前”。

這些東西有哪些實際的用途呢已日?Talk is cheap,show you the code垛耳!注意:以下例子是用scala寫的,這樣就避免了java字符串中“\”的轉(zhuǎn)義飘千。


是時候展示真正的技術(shù)了

負向斷言例子1

假設有幾個文件全名:"file1.mp3"堂鲜,"file2.bat","file3.txt"护奈,需要把英文句號之前的文件名提取出來缔莲。在這個過程中,需要忽略所有bat文件和mp3文件霉旗。

    val pattern ="""(\w+)\.(?!bat|mp3)(\w+)""".r
    val result = List("file1.mp3", "file2.bat", "file3.txt")
      .flatMap(s => {
        s match {
          case pattern(name, _) => List(name)
          case _ => Nil
        }
      })

這個負向先行斷言意思是此位置(句號后面)后面的字符串不能匹配“bat|mp3”痴奏,也就排除了bat和mp3擴展名蛀骇。

負向斷言例子2

例如需要在標書中需要提取采購聯(lián)系人的姓名。

采購人:大連理工大學
聯(lián)系人:張三

這時采購聯(lián)系人可以認為是張三

采購人:大連理工大學
代理機構(gòu):大連理工代理公司
聯(lián)系人:李四

這時李四不能認為是采購聯(lián)系人读拆,他應該是代理機構(gòu)聯(lián)系人擅憔。(別問我為什么不用如日中天、如火如荼的自然語言處理檐晕,而非要用正則表達式作繭自縛)
這時的正則表達式為

(采購人)(?!.*代理機構(gòu)).*?(聯(lián)系人:)(?<name>\S+)

它要求“采購人”后面出現(xiàn)“聯(lián)系人”暑诸,但是“采購人”后面不能有“代理機構(gòu)”。

事實上辟灰,嚴格來說應該要求“采購人”和“聯(lián)系人”之間不能有“代理機構(gòu)”个榕,anyway......who cares?

正向斷言例子1

提取獲取標書的開始時間。

需要購買標書的投標人,請于3月15日到26日登錄某某網(wǎng)站
招標文件下載時間:北京時間3月15日至3月22日

這個正則表達式要求后面有日期伞矩,前面要出現(xiàn)“購買標書”笛洛、“招標文件下載”等關(guān)鍵詞,這些關(guān)鍵詞是特定名詞和特定動詞的組合乃坤。

(標書|招標文件|購買|下載).*(?<month>\d+)月(?<day>\d+)日

這個正則表達式問題在于名詞和動詞沒有要求同時出現(xiàn)苛让。

((標書|招標文件) .*(購買|下載).*)|((購買|下載).*(標書|招標文件) .*)(?<month>\d+)月(?<day>\d+)日

這個要求倒是嚴格了,但是也太長了吧湿诊,增加了名詞和動詞時修改也不方便啊狱杰,要改兩個地方呢,容易出錯厅须。

(?<=(標書|招標文件).*)(?<=(購買|下載).*)(\d+)月(\d+)日

這個正向斷言則解決了以上兩個問題仿畸。

正向斷言例子2

常見的密碼強度驗證一般都要求:

  1. 8-12位
  2. 必須有大寫字母
  3. 必須有小寫字母
  4. 必須有數(shù)字
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,12}

這個正則表達式還是挺有用的,說不定哪次面試就用上了呢@屎汀4砉痢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眶拉,一起剝皮案震驚了整個濱河市千埃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忆植,老刑警劉巖放可,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朝刊,居然都是意外死亡耀里,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門拾氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯挎,“玉大人,你說我怎么就攤上這事咙鞍≈茫” “怎么了叠艳?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長易阳。 經(jīng)常有香客問我附较,道長,這世上最難降的妖魔是什么潦俺? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任拒课,我火速辦了婚禮,結(jié)果婚禮上事示,老公的妹妹穿的比我還像新娘早像。我一直安慰自己,他們只是感情好肖爵,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布卢鹦。 她就那樣靜靜地躺著,像睡著了一般劝堪。 火紅的嫁衣襯著肌膚如雪冀自。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天秒啦,我揣著相機與錄音熬粗,去河邊找鬼。 笑死余境,一個胖子當著我的面吹牛驻呐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芳来,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼含末,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了即舌?” 一聲冷哼從身側(cè)響起答渔,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侥涵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋雏,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡芜飘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了磨总。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦明。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚪燕,靈堂內(nèi)的尸體忽然破棺而出娶牌,到底是詐尸還是另有隱情奔浅,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布诗良,位于F島的核電站汹桦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鉴裹。R本人自食惡果不足惜舞骆,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望径荔。 院中可真熱鬧督禽,春花似錦、人聲如沸总处。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹦马。三九已至胧谈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菠红,已是汗流浹背第岖。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留试溯,地道東北人蔑滓。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像遇绞,于是被迫代替她去往敵國和親键袱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 版本:v2.3.5 (2017-6-12) 作者:deerchao 轉(zhuǎn)載請注明來源 目錄 跳過目錄 本文目標 如何...
    readilen閱讀 963評論 2 13
  • 正則表達式到底是什么東西摹闽?字符是計算機軟件處理文字時最基本的單位蹄咖,可能是字母,數(shù)字付鹿,標點符號澜汤,空格,換行符舵匾,漢字等...
    獅子挽歌閱讀 2,148評論 0 9
  • 本文主要總結(jié)了python正則零寬斷言(zero-length-assertion)的一些常用用法俊抵。 1. 什么是...
    m2fox閱讀 1,510評論 0 6
  • 正則表達式 \n\n\n 【5】正則表達式應用——刪除空行 啟動EditPlus,打開待處理的文本類型文件坐梯。 ①徽诲、...
    黃花菜已涼閱讀 1,045評論 0 4
  • 原文:http://www.jb51.net/tools/zhengze.html 然后強迫癥如我,因為我怕網(wǎng)頁哪...
    你再不來我要下雪了閱讀 837評論 1 6