Regex中的組是很NB
譚振林的正則系列講解 很好!
原貼:http://tuantuan.cnblogs.com/articles/416806.html 團團的園子
首相講講JScript的Regex對象RegExp。
JScript中提供Regex操作的類名為RegExp,可以用兩種方式執行個體化RegExp類型的對象。
方法一,建構函式執行個體化:
var myRegex = new RegExp("//w+", "igm ");
///w+為實際Regex,注意第一個/為轉義之用
igm分別表示忽略大小寫,全域搜尋,多行搜尋(一般預設m)
方法二,直接賦值法:
var myRegex = //w+/igm;
/正則式/igm 效果與上一個語句一樣,只是這裡不需要用轉移字元,原Regex是什麼樣子就是什麼樣子,igm就和前面例子的igm作用一樣
具體用什麼方式看大家喜好了,個人覺得第二種方式寫的正則比較好讀些,RegexBuddy協助文檔也是推薦第二種方式。
RegExp對象包含以下一些操作:
exec(string str):執行Regex匹配,並返回匹配結果,根據MSDN給出的例子運行結果看,exec每次執行都是從上次直接的匹配結束位置開始,並且返回的值似乎是RerExp對象,而RegexBuddy給出的解釋是返回一個數組,但是沒有給出詳細例子,我覺得還是根據實驗結果為依據比較可靠。
compile(string regex, string flags):先行編譯Regex以使其運行更快,經過測試的確預先編譯後效率有明顯提升。regex參數為Regex,flags可以為以下3個值的組合: g – 全域搜尋,我的實驗結果是不加g標誌就只能匹配第一個合格字串 i – 忽略大小寫 m – 多行搜尋,似乎預設已經是多行搜尋了
test(string str):如果str匹配Regex返回true,否則返回false,這個類似string對象的match方法
RegExp對象包含以下一些屬性:
index:字串中第一個匹配運算式的位置,初始為-1
input:Regex的匹配目標,注意是唯讀
lastIndex:下一個匹配運算式的位置,原話是(Returns the character position where the next match begins in a searched string.)也不知道有沒有翻譯錯,這個屬性我沒有用到。
lastMatch:最後一個匹配運算式的字串
lastParen:最後一個匹配的子匹配串,比如Regex裡有多個以()分組的匹配項,lastParen表示最後一組所匹配的結果
leftContext:從目標字串的開頭到last match的起始位置的所有字元。
rightContext:從last match的結束位置到整個目標字串的結束位置的所有字元。
$1…$9:表示第n組匹配的結果,這個在Regex裡有多個以()分組時有用
接下來講講,JScript中String對象與Regex有關的操作:
match(string regex):接受一個Regex,並返回該字串是否與這個運算式匹配。
replace(srting regex, string str):將與Regex匹配的子字串替換為str,這個函數看似簡單,不過還隱藏著更進階用法哦,請看以下例子。
例子1:
var str1 = "A:My name is Peter!/nB:Hi Peter!";
str1 = str1.replace(/Peter/g,"Jack");
alert(str1);
這個例子很簡單就是把字串替換了,這則運算式的威力當然不只於此,如果你用的熟練,還能用它完成很多以往需要大量程式碼完成的工作。比如在代碼關鍵字前後加上由於高亮顯示的HTML標籤。從前面例子看來似乎replace只能把匹配的文本替換成新的文本啊,怎麼利用它在關鍵字前後插入標籤呢?返過來想象,如果在替換時能利用匹配結果,那麼事情不就好辦了,只要將關鍵字替換為:標籤頭 + 關鍵字 + 標籤尾 不就行了。
可是要如何在replace中使用Regex匹配的結果呢?
這時候我們就需要用到“匹配變數”了,匹配變數用於表示正則匹配的結果,以下是匹配變數的說明:
$& -- 表示全部匹配組匹配的結果,最後再囉嗦一次,匹配組就是Regex的()分組
$$ -- 表示$字元,因為匹配變數用掉了$字元,所以需要轉義
$n -- 類似前面的$1…$9,表示第n組匹配的結果
$nn -- 很簡單就是第nn組匹配的結果
$` -- 就是前面提到過的leftContext,比如abcdefg被匹配出了d那麼abc就是它的leftContext了
$’ -- 和上面符合很接近不要看錯了!,這個就是rightContext了,舉一反三,efg就是上面例子的rightContext了 那麼現在我們要做到在關鍵字前後插入標籤就很簡單了:
var str1 = "A:My name is Peter!/nB:Hi Peter!";
str1 = str1.replace(/Peter/g, "$&");
alert(str1);
都0:39了。。。就寫到這裡吧。
正則工具軟體下載(密碼: regex):regex buddy 2.06.zip
我寫的例子請看:JScript做文法加亮顯示(代碼精簡)
一下是MSDN載抄的一些例子:
function matchDemo()
{
var s;
var re = new RegExp("d(b+)(d)","ig");
var str = "cdbBdbsbdbdz";
var arr = re.exec(str);
s = "$1 contains: " + RegExp.$1 + "/n";
s += "$2 contains: " + RegExp.$2 + "/n";
s += "$3 contains: " + RegExp.$3;
return(s);
}
function RegExpTest()
{
var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
if (ver >= 5.5){
var src = "The rain in Spain falls mainly in the plain.";
var re = //w+/g;
var arr;
while ((arr = re.exec(src)) != null)
print(arr.index + "-" + arr.lastIndex + "/t" + arr);
}
else{
alert("You need a newer version of JScript for this to work");
}
}
function matchDemo()
{
var s; //Declare variable.
var re = new RegExp("d(b+)(d)","ig"); //Regular expression pattern.
var str = "cdbBdbsbdbdz"; //String to be searched.
var arr = re.exec(str); //Perform the search.
s = "$1 returns: " + RegExp.$1 + "/n";
s += "$2 returns: " + RegExp.$2 + "/n";
s += "$3 returns: " + RegExp.$3 + "/n";
s += "input returns : " + RegExp.input + "/n";
s += "lastMatch returns: " + RegExp.lastMatch + "/n";
s += "leftContext returns: " + RegExp.leftContext + "/n";
s += "rightContext returns: " + RegExp.rightContext + "/n";
s += "lastParen returns: " + RegExp.lastParen + "/n";
return(s); //Return results.
}
document.write(matchDemo());
原貼:http://blog.csdn.net/duduwolf/archive/2004/08/21/80825.aspx
Regex是regular expression,看來英文比中文要好理解多了,就是檢查運算式符
不符合規定!!Regex有一個功能十分強大而又十分複雜的對象RegExp,在Javascript1.2 版本以
上提供。
下面我們看看有關Regex的介紹:
Regex對象用來規範一個規範的運算式(也就是運算式符不符合特定的要求,比如是不是Email
地址格式等),它具有用來檢查給出的字串是否符合規則的屬性和方法。
除此之外,你用RegExp構造器建立的個別Regex對象的屬性,就已經預先定義好了Regex
對象的靜態屬性,你可以隨時使用它們。
核心對象:
在Javascript 1.2, NES 3.0以上版本提供。
在Javascript 1.3以後版本增加了toSource方法。
建立方法:
文字格式或RegExp構造器函數。
文字建立格式使用以下格式:
/pattern/flags即/模式/標記
構造器函數方法使用方法如下:
new RegExp("pattern"[, "flags"])即new RegExp("模式"[,"標記"])
參數:
pattern(模式)
表示Regex的文本
flags(標記)
如果指定此項,flags可以是下面值之一:
g: global match(全定匹配)
i: ignore case(忽略大小寫)
gi: both global match and ignore case(匹配所有可能的值,也忽略大小寫)
注意:文字格式設定中的參數不要使用引號標記,而構造器函數的參數則要使用引號標記。所以下面的
運算式建立同樣的Regex:
/ab+c/i
new RegExp("ab+c", "i")
描述:
當使用建構函式的時候,必須使用正常的字串避開規則(在字串中加入前置字元/ )是必須的。
例如,下面的兩條語句是等價的:
re = new RegExp("//w+")
re = //w+/
下面的提供了在Regex中能夠使用的完整對特殊字元的一個完整的列表和描述。
表1.3:Regex中的特殊字元:
字元/
意義:對於字元,通常表示按字面意義,指出接著的字元為特殊字元,/不作解釋。
例如:/b/匹配字元’b’,通過在b 前面加一個反斜線/,也就是//b/,則該字元變成特殊字元,表示
匹配一個單詞的分界線。
或者:
對於幾個字元,通常說明是特殊的,指出緊接著的字元不是特殊的,而應該按字面解釋。
例如:*是一個特殊字元,匹配任意個字元(包括0個字元);例如:/a*/意味匹配0個或多個a。
為了匹配字面上的*,在a前面加一個反斜線;例如:/a/*/匹配’a*’。
字元^
意義:表示匹配的字元必須在最前邊。
例如:/^A/不匹配"an A,"中的’A’,但匹配"An A."中最前面的’A’。
字元$
意義:與^類似,匹配最末的字元。
例如:/t$/不匹配"eater"中的’t’,但匹配"eat"中的’t’。
字元*
意義:匹配*前面的字元0次或n次。
例如:/bo*/匹配"A ghost booooed"中的’boooo’或"A bird warbled"中的’b’,但不匹配"A goat g
runted"中的任何字元。
字元+
意義:匹配+號前面的字元1次或n次。等價於{1,}。
例如:/a+/匹配"candy"中的’a’和"caaaaaaandy."中的所有’a’。
字元?
意義:匹配?前面的字元0次或1次。
例如:/e?le?/匹配"angel"中的’el’和"angle."中的’le’。
字元.
意義:(小數點)匹配除分行符號外的所有單個的字元。
例如:/.n/匹配"nay, an apple is on the tree"中的’an’和’on’,但不匹配’nay’。
字元(x)
意義:匹配’x’並記錄匹配的值。
例如:/(foo)/匹配和記錄"foo bar."中的’foo’。匹配子串能被結果數組中的素[1], ..., [n] 返
回,或被RegExp對象的屬性$1, ..., $9返回。
字元x|y
意義:匹配’x’或者’y’。
例如:/green|red/匹配"green apple"中的’green’和"red apple."中的’red’。
字元{n}
意義:這裡的n是一個正整數。匹配前面的n個字元。
例如:/a{2}/不匹配"candy,"中的’a’,但匹配"caandy," 中的所有’a’和"caaandy."中前面的兩個
’a’。
字元{n,}
意義:這裡的n是一個正整數。匹配至少n個前面的字元。
例如:/a{2,}不匹配"candy"中的’a’,但匹配"caandy"中的所有’a’和"caaaaaaandy."中的所有’a’
字元{n,m}
意義:這裡的n和m都是正整數。匹配至少n個最多m個前面的字元。
例如:/a{1,3}/不匹配"cndy"中的任何字元,但匹配 "candy,"中的’a’,"caandy," 中的前面兩個
’a’和"caaaaaaandy"中前面的三個’a’,注意:即使"caaaaaaandy" 中有很多個’a’,但只匹配前面的三
個’a’即"aaa"。
字元[xyz]
意義:一字元列表,匹配列出中的任一字元。你可以通過連字號-指出一個字元範圍。
例如:[abcd]跟[a-c]一樣。它們匹配"brisket"中的’b’和"ache"中的’c’。
字元[^xyz]
意義:一字元補集,也就是說,它匹配除了列出的字元外的所有東西。 你可以使用連字號-指出一
字元範圍。
例如:[^abc]和[^a-c]等價,它們最早匹配"brisket"中的’r’和"chop."中的’h’。
字元[/b]
意義:匹配一個空格(不要與/b混淆)
字元/b
意義:匹配一個單詞的分界線,比如一個空格(不要與[/b]混淆)
例如://bn/w/匹配"noonday"中的’no’,//wy/b/匹配"possibly yesterday."中的’ly’。
字元/B
意義:匹配一個單詞的非分界線
例如://w/Bn/匹配"noonday"中的’on’,/y/B/w/匹配"possibly yesterday."中的’ye’。
字元/cX
意義:這裡的X是一個控制字元。匹配一個字串的控制字元。
例如://cM/匹配一個字串中的control-M。
字元/d
意義:匹配一個數字,等價於[0-9]。
例如://d/或/[0-9]/匹配"B2 is the suite number."中的’2’。
字元/D
意義:匹配任何的非數字,等價於[^0-9]。
例如://D/或/[^0-9]/匹配"B2 is the suite number."中的’B’。
字元/f
意義:匹配一個表單符
字元/n
意義:匹配一個分行符號
字元/r
意義:匹配一個斷行符號符
字元/s
意義:匹配一個單個white空格符,包括空格,tab,form feed,分行符號,等價於[ /f/n/r/t/v]。
例如://s/w*/匹配"foo bar."中的’ bar’。
字元/S
意義:匹配除white空格符以外的一個單個的字元,等價於[^ /f/n/r/t/v]。
例如://S//w*匹配"foo bar."中的’foo’。
字元/t
意義:匹配一個定位字元
字元/v
意義:匹配一個頂頭定位字元
字元/w
意義:匹配所有的數字和字母以及底線,等價於[A-Za-z0-9_]。
例如://w/匹配"apple,"中的’a’,"$5.28,"中的’5’和"3D."中的’3’。
字元/W
意義:匹配除數字、字母外及底線外的其它字元,等價於[^A-Za-z0-9_]。
例如://W/或者/[^$A-Za-z0-9_]/匹配"50%."中的’%’。
字元/n
意義:這裡的n是一個正整數。匹配一個Regex的最後一個子串的n的值(計數左圓括弧)。
例如:/apple(,)/sorange/1/匹配"apple, orange, cherry, peach."中的’apple, orange’,下面
有一個更加完整的例子。
注意:如果左圓括弧中的數字比/n指定的數字還小,則/n取下一行的八進位escape作為描述。
字元/ooctal和/xhex
意義:這裡的/ooctal是一個八進位的escape值,而/xhex是一個十六進位的escape值,允許在一個
Regex中嵌入ASCII碼。
當運算式被檢查的時候,文字元號提供了編輯Regex的方法。利用文字元號可以使到正則表達
式保持為常數。例如,如果你在一個迴圈中使用文字元號來構造一個Regex,Regex不需進行
反覆編譯。
Regex物件建構器,例如,new RegExp("ab+c"),提供Regex的運行時編譯。當你知道正
則運算式的模式會變化的時候,應該使用建構函式,或者你不知道Regex的模式,而它們是從另外
的源獲得的時候,比如由使用者輸入時。一旦你定義好了Regex,該Regex可在任何地方使用,
並且可以改變,你可以使用編譯方法來編譯一個新的Regex以便重新使用。
一個分離預先定義的RegExp對象可以在每個視窗中使用;也就是說,每個分離的Javascript線程運
行以獲得自己的RegExp對象。因為每個指令碼在一個線程中是不可中斷的,這就確保了不同的指令碼不會覆
蓋RegExp對象的值。
預定義的RegExp對象包含的靜態屬性:input, multiline, lastMatch,lastParen, leftContext,
rightContext, 以及從$1到$9。input和multiline屬效能被預設。其它靜態屬性的值是在執行個別正則
運算式對象的exec和test方法後,且在執行字串的match和replace方法後設定的。
屬性
注意RegExp對象的幾個屬性既有長名字又有短名字(象Perl)。這些名字都是指向相同的值。Perl是
一種程式設計語言,而Javascript模仿了它的Regex。
屬性$1, ..., $9
取得匹配的子串,如果有的話
屬性$_
參考input
屬性$*
參考multiline
屬性$&
參考lastMatch
屬性$+
參考lastParen
屬性$`
參考leftContext
屬性$’
參考rightContext
屬性constructor
指定用來建立對象原型函
屬性global
決定是否測試Regex是否不能匹配所有的字串,或者只是與最先的衝突。
屬性ignoreCase
決定試圖匹配字串的時候是否忽略大小寫
屬性input
當Regex被匹配的時候,為相反的字串。
屬性lastIndex
決定下一次匹配從那裡開始
屬性lastMatch
最後一個匹配的字元
屬性lastParen
子串匹配的時候,最後一個parenthesized,如果有的話。
屬性leftContext
最近一次匹配前的子串。
屬性multiline
是否在串的多行中搜尋。
屬性prototype
允許附加屬性到所有的對象
屬性rightContext
最近一次匹配後的的子串。
屬性source
模式文本
方法
compile方法
編譯一個Regex對象
exec方法
運行Regex匹配
test方法
測試正則達式匹配
toSource方法
返回一個對象的文字描述指定的對象;你可以使用這個值來建立一個新的對象。不考慮Object.toS
ource方法。
toString方法
返回一個字串描述指定的對象,不考慮Object.toString對象。
valueOf方法
返回指定對角的原始值。不考慮Object.valueOf方法。
另外,這個對象繼承了對象的watch和unwatch方法
例子:
例1、下述樣本指令碼使用replace方法來轉換串中的單詞。在替換的文本中,指令碼使用全域 RegExp
對象的$1和$2屬性的值。注意,在作為第二個參數傳遞給replace方法的時候,RegExp對象的$屬性的名
稱。
顯示結果:"Smith, John".
例2、下述樣本指令碼中,RegExp.input由Change事件處理控制代碼設定。在getInfo函數中,exec 方法
使用RegExp.input的值作為它的參數,注意RegExp預置了$屬性。
請輸入你的姓和年齡,輸入完後按斷行符號鍵。