正則表達(dá)式教程之位置匹配詳解
本文實(shí)例講述了正則表達(dá)式教程之位置匹配。分享給大家供大家參考,具體如下:
注:在所有例子中正則表達(dá)式匹配結(jié)果包含在源文本中的【和】之間,有的例子會(huì)使用Java來(lái)實(shí)現(xiàn),如果是java本身正則表達(dá)式的用法,會(huì)在相應(yīng)的地方說(shuō)明。所有java例子都在JDK1.6.0_13下測(cè)試通過(guò)。
一、問(wèn)題引入
如果想匹配一段文本中的某個(gè)單詞(暫不考慮多行模式,將在后面介紹),我們可能會(huì)像下面這樣:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正則表達(dá)式:is
結(jié)果:Yesterday 【is】 h【is】tory, tomorrow 【is】 a mystery, but today 【is】 a gift.
分析:本來(lái)只是要匹配單詞is,但把其他單詞中包含的is也匹配出來(lái)了。要解決這個(gè)問(wèn)題,使用邊界界定符,也就是在正則表達(dá)式里用一些元字符來(lái)表明我們想讓匹配操作在什么位置(或邊界)發(fā)生。
二、單詞邊界
一種常用的邊界是由限定符\b指定的單詞邊界,\b用來(lái)匹配單詞的開(kāi)始和結(jié)尾。更確切地說(shuō),它是匹配這樣一個(gè)位置,這個(gè)位置位于一個(gè)能夠用來(lái)構(gòu)成單詞的字符(字母、數(shù)字、下劃線,也就是與\w相匹配的字符)和一個(gè)不能用來(lái)構(gòu)成單詞的字符(與\W相匹配的字符)之間。來(lái)看前面的例子:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正則表達(dá)式:\bis\b
結(jié)果:Yesterday 【is】 history, tomorrow 【is】 a mystery, but today 【is】 a gift.
分析:在原始文本中,單詞is的前后都有一個(gè)空格,而這與模式\bis\b匹配(空格是用來(lái)分隔單詞的字符之一)。而單詞history中也包含了is,因?yàn)樗那昂蠓謩e有一個(gè)字符h和t,這兩個(gè)字符都不能與\b匹配。
如果不匹配一個(gè)單詞邊界,則使用\B。如:
文本:Please enter the nine-digit id as it appears on your color - coded pass-key.
正則表達(dá)式:\B-\B
結(jié)果:Please enter the 【nine-digit】 id as it appears on your color - coded 【pass-key】.
分析:\B-\B將匹配一個(gè)前后都不是單詞邊界的連字符,nine-digit和pass-key中連字符前后都沒(méi)有空格,所以能夠匹配,而color - coded中連字符前后都有空格,所以不能匹配。
三、字符串邊界
單詞邊界可以用來(lái)進(jìn)行與單詞有關(guān)的位置匹配(單詞開(kāi)頭、結(jié)束、整個(gè)單詞等等)。而字符串邊界也有著類(lèi)似的用途,只不過(guò)是用來(lái)進(jìn)行與字符串有關(guān)的位置匹配(字符串開(kāi)頭、結(jié)束、整個(gè)字符串等等)。用來(lái)定義字符串邊界的元字符有兩個(gè):一個(gè)是用來(lái)定義字符串開(kāi)頭的^,另一個(gè)是用來(lái)定義字符串結(jié)尾的$。
比如要檢查一個(gè)XML文檔的合法性,合法的XML文檔都以<?xml…..?>這樣形式開(kāi)頭:
文本:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="ear"> </project>
正則表達(dá)式:^\s*<\?xml.*?\?>
結(jié)果:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>
分析:^匹配一個(gè)字符串的開(kāi)頭位置,所以^\s*將匹配一個(gè)字符串的開(kāi)頭位置和隨后的零個(gè)或多個(gè)空白字符,因?yàn)?lt;?xml>標(biāo)簽前面允許有空格、制表符、換行符等空白字符。
$元字符符的用法除了位置上的差異外,與^用法完全一樣。比如,檢查一個(gè)html頁(yè)面是否以</html>結(jié)尾,可以用模式:</[Hh][Tt][Mm][Ll]>\s*$
四、多行匹配模式
正則表達(dá)式可以通過(guò)一些特殊的元字符來(lái)改變另外一些元字符的行為??梢酝ㄟ^(guò)(?m) 來(lái)啟用多行匹配模式。多行匹配模式將使得正則表達(dá)式引擎把行分隔符當(dāng)做一個(gè)字符串分隔符來(lái)對(duì)待。在多行匹配模式下,^不僅匹配正常的字符串開(kāi)頭,還將匹配行分隔符(換行符)后面的開(kāi)始位置,$不僅匹配正常的字符串結(jié)尾,還將匹配行分隔符(換行符)后面的結(jié)束位置。
在使用時(shí),(?m)必須出現(xiàn)在整個(gè)模式的最前面。比如,通過(guò)正則表達(dá)式把一段java代碼中的單行注釋?zhuān)ㄒ?/開(kāi)始)內(nèi)容全部找出來(lái)。
文本:
publicDownloadingDialog(Frame parent){ //Callsuper constructor, specifying that dialog box is modal. super(parent,true); //Setdialog box title. setTitle("E-mailClient"); //Instructwindow not to close when the "X" is clicked. setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); //Puta message with a nice border in this dialog box. JPanelcontentPanel = new JPanel(); contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5)); contentPanel.add(newJLabel("Downloading messages...")); setContentPane(contentPanel); //Sizedialog box to components. pack(); //Centerdialog box over application. setLocationRelativeTo(parent); }
正則表達(dá)式:(?m)^\s*//.*$
結(jié)果:
publicDownloadingDialog(Frame parent){
【 //Call superconstructor, specifying that dialog box is modal.】
super(parent,true);
【 //Set dialog boxtitle.】
setTitle("E-mailClient");
【 //Instruct windownot to close when the "X" is clicked.】
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
【 //Put a messagewith a nice border in this dialog box.】
JPanelcontentPanel = new JPanel();
contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5));
contentPanel.add(newJLabel("Downloading messages..."));
setContentPane(contentPanel);
【 //Size dialog boxto components.】
pack();
【 //Center dialogbox over application.】
setLocationRelativeTo(parent);
}
分析:^\s*//.*$將匹配一個(gè)字符串的開(kāi)始,然后是任意多個(gè)空白字符,再后面是//,再往后是任意文本,最后是一個(gè)字符串的結(jié)束。不過(guò)這個(gè)模式只能找出第一條注釋?zhuān)由??m)前綴后,將把換行符視為一個(gè)字符串分隔符,這樣就可以把每一行注釋匹配出來(lái)了。
java代碼實(shí)現(xiàn)如下(文本保存在text.txt文件中):
public static String getTextFromFile(String path) throws Exception{ BufferedReader br = new BufferedReader(new FileReader(new File(path))); StringBuilder sb = new StringBuilder(); char[] cbuf = new char[1024]; int len = 0; while(br.ready() && (len = br.read(cbuf)) > 0){ br.read(cbuf); sb.append(cbuf, 0, len); } br.close(); return sb.toString(); } public static void multilineMatch() throws Exception{ String text = getTextFromFile("E:/text.txt"); String regex = "(?m)^\\s*//.*$"; Matcher m = Pattern.compile(regex).matcher(text); while(m.find()){ System.out.println(m.group()); } }
輸出結(jié)果如下:
//Call super constructor, specifying that dialog box is modal.
//Set dialog box title.
//Instruct window not to close when the "X" is clicked.
//Put a message with a nice border in this dialog box.
//Size dialog box to components.
//Center dialog box over application.
五、小結(jié)
正則表達(dá)式不僅可以用來(lái)匹配任意長(zhǎng)度的文本塊,還可以用來(lái)匹配出現(xiàn)在字符串中特定位置的文本。\b用來(lái)指定一個(gè)單詞邊界(\B剛好相反)。^和$用來(lái)指定單詞邊界。如果與(?m)配合使用,^和$還將匹配在一個(gè)換行符處開(kāi)頭或結(jié)尾的字符串。在接下來(lái)的文章中將介紹子表達(dá)式的使用。
PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:
JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg
希望本文所述對(duì)大家正則表達(dá)式學(xué)習(xí)有所幫助。
- 正則表達(dá)式匹配用戶(hù)密碼
- Javascript校驗(yàn)密碼復(fù)雜度的正則表達(dá)式
- 手機(jī)號(hào)碼,密碼正則驗(yàn)證
- php password密碼驗(yàn)證正則表達(dá)式(8位長(zhǎng)度限制)
- js正則實(shí)現(xiàn)的密碼框簡(jiǎn)單制作,還可以替換成自己想用得符號(hào)
- 密碼強(qiáng)度檢測(cè)函數(shù)(正則)
- 正則表達(dá)式教程之重復(fù)匹配詳解
- 正則表達(dá)式教程之匹配一組字符詳解
- 正則表達(dá)式教程之匹配單個(gè)字符詳解
- JS正則匹配中文的方法示例
- 正則匹配密碼只能是數(shù)字和字母組合字符串功能【php與js實(shí)現(xiàn)】
相關(guān)文章
Javascript Validation for email(正則表達(dá)式) 英文翻譯
javascript中通過(guò)正則表達(dá)式驗(yàn)證email地址是否符合規(guī)則,需要的朋友可以參考下。2011-10-10JavaScript 使用正則表達(dá)式進(jìn)行表單驗(yàn)證的示例代碼
上篇文章 JavaScript 表單驗(yàn)證正則表達(dá)式大全 說(shuō)的是javascript中使用的正則表達(dá)式的例子,但是沒(méi)有說(shuō)這些正則表達(dá)式如何使用,現(xiàn)在給大家?guī)讉€(gè)例子,大家可以看看。2009-08-08正則驗(yàn)證不能含有中文的實(shí)現(xiàn)方法【jQuery與java實(shí)現(xiàn)】
這篇文章主要介紹了正則驗(yàn)證不能含有中文的實(shí)現(xiàn)方法,結(jié)合jQuery與java兩種實(shí)現(xiàn)方法分析了針對(duì)中文的正則驗(yàn)證操作技巧,需要的朋友可以參考下2017-01-01自動(dòng)檢測(cè)數(shù)字替換非數(shù)字的正則表達(dá)式
這篇文章主要介紹了自動(dòng)檢測(cè)數(shù)字替換非數(shù)字的正則表達(dá)式 ,需要的朋友可以參考下2016-05-05詳解正則表達(dá)式Matcher類(lèi)中g(shù)roup方法
這篇文章主要介紹了正則表達(dá)式Matcher類(lèi)中g(shù)roup方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08密碼強(qiáng)度的正則表達(dá)式兩種方案JS總結(jié)篇
本文給出了兩個(gè)密碼強(qiáng)度的正則表達(dá)式方案,一個(gè)簡(jiǎn)單,一個(gè)更復(fù)雜和安全。并分別給出了兩個(gè)方案的解析和測(cè)試程序。對(duì)密碼強(qiáng)度正則表達(dá)式的兩種方案感興趣的朋友跟隨腳本之家一起看看吧2018-03-03asp去掉html,保留img br p div的正則實(shí)現(xiàn)代碼
非常實(shí)用的一個(gè)函數(shù),這里主要用到了正則的匹配模式大家可以看腳本之家網(wǎng)站的正則專(zhuān)題2009-02-02