1. 程式人生 > >正則表示式中的的向前匹配、向後匹配、負向前匹配、負向後匹配寫法

正則表示式中的的向前匹配、向後匹配、負向前匹配、負向後匹配寫法

比如我們要匹配下面這個語句中的“<”後面不是“br>”的“<”:
<div>line1</div> <br> 

這個正則表示式這麼寫:

/<(?!br>)/

如果我們只匹配後面為“br>”的“<”呢,正則表示式這麼寫:
/<(?=br>)/

這兩種語法在正則表示式中稱之為:
(?=pattern) 零寬正向先行斷言
(?!pattern) 零寬負向先行斷言
斷言的意思是判斷是否滿足,零寬的意思是它只匹配一個位置,如同^匹配開頭,$匹配末尾一樣,只是一個位置,不返回匹配到的字元,正向表示需要滿足pattern,負向表示不能滿足pattern,先行表示這個斷言語句現在期望返回的匹配字元的後面。

我們在來假設一個需求,如果我要匹配不在“<br>”中的“>”,也就是說只匹配“<div>”、“</div>”中的“>”,而不匹配“<br>”中的“>”,那麼要寫的正則表示式就是“匹配前面沒有'<br'的'>'”,寫法如下:
/(?<!<br)>/

對應的如果只匹配“<br>”中的“>”,而不匹配“<div>”或者“</div>”中的“>”,就這麼寫:
/(?<=<br)>/

這兩種語法在正則表示式中稱之為:
(?<=pattern) 零寬正向後行斷言
(?<!pattern) 零寬負向後行斷言
與先行斷言的意思一樣,只不過後行斷言寫在需要匹配的字元的前面,表示如果前面的字元滿足pattern就返回。
但是很遺憾的是javascript中並不支援這種後行斷言。

那如果在javascript中我們想將“<div>”和“</div>”中的“>”替換成“&gt;”,但是不影響“<br>”中的“>”,那怎麼寫呢,先看程式碼:
var s = "<div>line1</div> <br>";
var r = /(<br)?>/g;
s.replace(r, function($0, $1) { return $1?"":">";});

這裡用到了replace函式的第二個引數,這個引數可以是一個值,也可以是一個函式,這個函式需要返回一個用於替換匹配結果的字串,所以我們就可以利用這個函式的處理功能處理匹配到的結果,上面這個語句的意思就是使用“r”來匹配“s”,匹配之後“$0”中儲存匹配到的完整結果,“$1”中匹配到“<br”,函式處理的結果就使,如果“$1”有值(表示“>”前面有“<br”),則返回一個空字串(也就使不替換),如果“$1”沒有值(表示“>”前面沒有“<br”),則使用“&gt;”替換。

相關推薦

表示式的的向前匹配匹配向前匹配匹配寫法

比如我們要匹配下面這個語句中的“<”後面不是“br>”的“<”: <div>line1</div> <br> 這個正則表示式這麼寫: /<(?!br>)/ 如果我們只匹配後面為“br>”的“<”

關於python表示式匹配分組的問題

在爬取網頁資訊時,我們不妨會用到Python正則表示式。之前一直沒有太明白關於正則表示式匹配分組的問題,今天終於搞清楚了,所以特意寫一下讓自己印象深刻。 myPage = requests.get(url).content.decode("gbk") 通過requests我們在網頁得到了這樣

表示式Pattern類Matcher類和matches()方法簡析

1.簡介:  java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。  它包括兩個類:Pattern和Matcher 。 Pattern: 一個Pattern是一個正則表示式經編譯後的表現模式。  Matcher: 一個Matcher物件

Python3 表示式group()方法獲得匹配結果

正則表示式中用match()方法可以獲得匹配的字串內容。 如果想從字串中提取出一部分內容,可以用括號將提取目標括起來。 括號()實際上標記了一個子表示式的開始和結束的位置,被標記的每個子表示式會依次對應每個分組,呼叫group()方法傳入分組的索引即可獲得提取的結果。

表示式的貪婪匹配——python學習筆記

貪婪匹配 1.1 概念 正則匹配預設是貪婪匹配,也就是匹配儘可能多的字元。舉例如下,匹配出數字後面的0;以下例子是用python寫的,但是貪婪匹配的概念在其他語言中是一致的。 import re result = re.match(r'^(\d+)(0*)$', '102300

如何理解PHP表示式$1$2$3......

今天看《PHP從入門到精通》的時候,遇到了一個例子: 上面的這個例子$1就是代表$string中的“粗體字”這三個字。 其實$1,$2,$3這類的術語和正則表示式中的反向引用有關,你可以用它們代表在

表示式匹配字元括號'['

>>> import re >>> a = "abc[123]abc" >>> b = re.match(r"(.*)\[([^\[\]]*)\]

表示式^/$和img的使用

<script type="text/javascript"> var p = /[A-Za-z]+$/m; var s = '1a\n2b\n3c\n4d\n5e\n6f'; console.log(p.test(s));  //顯示為true //返回上一次正則表示式搜尋時,被搜尋字串中最後一

js表示式關於零寬斷言的奇異現象

碰到一個特別的需求,就是有一段Sql Server 的 SQL片段,內容大概就是所有JOIN表的集合,要求把這個SQL片段分割成陣列,每個元素就是包含單個表的字串。 例如: SQL = INNER JOIN Sale b ON 1=1 LEFT JOIN OutStock c

php 表示式的 .*? 表示什麼意思

我們知道我 .* 是任意字元,有的時候比較困惑在加個?什麼意思。 ?是非貪婪模式.*會匹配後面的一切字元,就是到結束的意思加?後就是不貪婪模式,這時要看?後邊的字元是什麼了,如.*?"的意思是遇到雙引號則匹配結束 例如: 現在我要匹配出圖片中的src,圖片格式為:"圖片01<img src='ht

表示式常用字串方法

1,search()用於檢索字串中指定的子字串,或檢索與正則表示式相匹配的子字串,並返回子串的起始位置。search()方法不支援全域性搜尋,因為會忽略正則表示式引數的標識g,並且也忽略了regexp的lastIndex屬性,總是從字串的開始位置進行檢索,所以它會總是返回str的第一個匹配的位置。 &n

表示式如何新增變數

如果給義一個字串或是陣列加入變數,是非常簡單的事情,但是我們不能用這種常規思維來給正則表示式加入變數,比如 var param = 3; var reg = "/^[0-9]+"+param+"[a-z]+$/"; ✘ var reg = /^[0-9]+"+param+"[a-z]+$

表示式的模式,函式,及使用規則

一、正則表示式轉義 正則中的特殊符號: . * ? $ [] {} () | \ 正則表示式匹配特殊字元如果需要加 \ 表達轉義,比如: pattern

表示式的分組() ----填坑

import re string="abcdefg acbdgef abcdgfe cadbgfe" #帶括號與不帶括號的區別 #不帶括號 regex=re.compile("((\w+)\s+\w+)") print(regex.findall(string)) #輸出:[('abcde

PHP表示式的元字元

假設我們需要在一個字串中查詢he,我們可以使用正則he,這是最簡單的正則表示式,它會精確地匹配這樣的字串:有兩個字元組成,前一個字元是h後一個字元是e。一般情況下,處理正則表示式的工具會提供一個忽略大小寫的選項,如果選擇了,這個表示式就可以匹配he、HE、He、hE這四種情況的任意一種,但是呢,

java表示式出現空格

在正則表示式中是可以使用空格的,儘管空格可以用 \s表示。 在java正則中,我初次遇到帶有空格的正則時可謂是一臉懵B,當時就提出疑問,java中的空格不是可以用\s來表示嗎? 隨後我測試了一下,程式碼如下,一目瞭然。 public class TheBlankSpace { publ

(轉)表示式^的用法

  https://www.cnblogs.com/ytc6/p/8478989.html   用法一:   限定開頭     文件上給出瞭解釋是匹配輸入的開始,如果多行標示被設定成了true,同時會匹配後面緊跟的字元。&n

java表示式要轉義的字元。

$  :匹配輸入字串的結尾位置。如果設定了 RegExp 物件的 Multiline 屬性,則 $ 也匹配 ‘\n' 或 ‘\r'。 ( ) :標記一個子表示式的開始和結束位置。   *  :匹配前面的子表示式零次或多次。   +  :匹配前面的子表示式一次或多次。  

關於java表示式的 ^和$的使用

java正則表示式的邊界匹配符中,有兩個比較常用的字元:“ ^ ”和“ $ ”,這兩個字元理解起來比較容易混淆。先說下這兩個字元的含義: “ ^ ”:匹配輸入字串開始的位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 還會與”\n”或”\r

表示式的\\\\/四個反斜槓含義

<? php echo '\\'; 執行結果:\  由此可見,在字串中,兩個反斜槓被解釋為一個反斜槓,然後在作為正則表示式, \\ 則被正則表示式引擎解釋為 \,所以在正則表示式中需要使用四個反斜槓。  也就是說,前兩個反斜槓在字串中被解釋為一個反斜槓,後兩個也