亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

正則表達式教程之位置匹配詳解

2020-01-20 22:03:01
字體:
來源:轉載
供稿:網友

本文實例講述了正則表達式教程之位置匹配。分享給大家供大家參考,具體如下:

注:在所有例子中正則表達式匹配結果包含在源文本中的之間,有的例子會使用Java來實現,如果是java本身正則表達式的用法,會在相應的地方說明。所有java例子都在JDK1.6.0_13下測試通過。

一、問題引入

如果想匹配一段文本中的某個單詞(暫不考慮多行模式,將在后面介紹),我們可能會像下面這樣:

文本:Yesterday is history, tomorrow is a mystery, but today is a gift.

正則表達式:is

結果:Yesterday 【is】 h【is】tory, tomorrow 【is】 a mystery, but today 【is】 a gift.

分析:本來只是要匹配單詞is,但把其他單詞中包含的is也匹配出來了。要解決這個問題,使用邊界界定符,也就是在正則表達式里用一些元字符來表明我們想讓匹配操作在什么位置(或邊界)發生。

二、單詞邊界

一種常用的邊界是由限定符/b指定的單詞邊界,/b用來匹配單詞的開始和結尾。更確切地說,它是匹配這樣一個位置,這個位置位于一個能夠用來構成單詞的字符(字母、數字、下劃線,也就是與/w相匹配的字符)和一個不能用來構成單詞的字符(與/W相匹配的字符)之間。來看前面的例子:

文本:Yesterday is history, tomorrow is a mystery, but today is a gift.

正則表達式:/bis/b

結果:Yesterday 【is】 history, tomorrow 【is】 a mystery, but today 【is】 a gift.

分析:在原始文本中,單詞is的前后都有一個空格,而這與模式/bis/b匹配(空格是用來分隔單詞的字符之一)。而單詞history中也包含了is,因為它的前后分別有一個字符h和t,這兩個字符都不能與/b匹配。

如果不匹配一個單詞邊界,則使用/B。如:

文本:Please enter the nine-digit id as it appears on your color - coded pass-key.

正則表達式:/B-/B

結果:Please enter the 【nine-digit】 id as it appears on your color - coded 【pass-key】.

分析:/B-/B將匹配一個前后都不是單詞邊界的連字符,nine-digit和pass-key中連字符前后都沒有空格,所以能夠匹配,而color - coded中連字符前后都有空格,所以不能匹配。

三、字符串邊界

單詞邊界可以用來進行與單詞有關的位置匹配(單詞開頭、結束、整個單詞等等)。而字符串邊界也有著類似的用途,只不過是用來進行與字符串有關的位置匹配(字符串開頭、結束、整個字符串等等)。用來定義字符串邊界的元字符有兩個:一個是用來定義字符串開頭的^,另一個是用來定義字符串結尾的$。

比如要檢查一個XML文檔的合法性,合法的XML文檔都以<?xml…..?>這樣形式開頭:

文本:

<?xml version="1.0" encoding="UTF-8"?><project basedir="." default="ear"></project>

正則表達式:^/s*</?xml.*?/?>

結果:

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>

分析:^匹配一個字符串的開頭位置,所以^/s*將匹配一個字符串的開頭位置和隨后的零個或多個空白字符,因為<?xml>標簽前面允許有空格、制表符、換行符等空白字符。

$元字符符的用法除了位置上的差異外,與^用法完全一樣。比如,檢查一個html頁面是否以</html>結尾,可以用模式:</[Hh][Tt][Mm][Ll]>/s*$

四、多行匹配模式

正則表達式可以通過一些特殊的元字符來改變另外一些元字符的行為??梢酝ㄟ^(?m) 來啟用多行匹配模式。多行匹配模式將使得正則表達式引擎把行分隔符當做一個字符串分隔符來對待。在多行匹配模式下,^不僅匹配正常的字符串開頭,還將匹配行分隔符(換行符)后面的開始位置,$不僅匹配正常的字符串結尾,還將匹配行分隔符(換行符)后面的結束位置。

在使用時,(?m)必須出現在整個模式的最前面。比如,通過正則表達式把一段java代碼中的單行注釋(以//開始)內容全部找出來。

文本:

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);}

正則表達式:(?m)^/s*//.*$

結果:

         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*//.*$將匹配一個字符串的開始,然后是任意多個空白字符,再后面是//,再往后是任意文本,最后是一個字符串的結束。不過這個模式只能找出第一條注釋,加上(?m)前綴后,將把換行符視為一個字符串分隔符,這樣就可以把每一行注釋匹配出來了。

java代碼實現如下(文本保存在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());  }}

輸出結果如下:

//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.

五、小結

正則表達式不僅可以用來匹配任意長度的文本塊,還可以用來匹配出現在字符串中特定位置的文本。/b用來指定一個單詞邊界(/B剛好相反)。^和$用來指定單詞邊界。如果與(?m)配合使用,^和$還將匹配在一個換行符處開頭或結尾的字符串。在接下來的文章中將介紹子表達式的使用。

PS:這里再為大家提供2款非常方便的正則表達式工具供大家參考使用:

JavaScript正則表達式在線測試工具:
http://tools.VeVB.COm/regex/javascript

正則表達式在線生成工具:
http://tools.VeVB.COm/regex/create_reg

希望本文所述對大家正則表達式學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日日骚久久av| 国产精品偷伦一区二区| 久久精品国产v日韩v亚洲| 亚洲国产91精品在线观看| 国产欧美va欧美va香蕉在| 日本午夜在线亚洲.国产| 国产美女扒开尿口久久久| 亚洲欧美日韩国产精品| 久久久久久亚洲精品中文字幕| 日韩一区二区av| 91精品国产乱码久久久久久久久| 国产精品三级在线| 欧美性猛交xxxx| 亚洲欧美综合精品久久成人| 国产精品久久77777| 亚洲国产精品视频在线观看| 久久综合色88| 欧美成人精品影院| 亚洲午夜未满十八勿入免费观看全集| 日韩精品中文字幕在线观看| 海角国产乱辈乱精品视频| 国产成人avxxxxx在线看| 欧美日产国产成人免费图片| 欧美激情极品视频| 国产精品69av| 久久久久久18| 亚洲色图校园春色| 亚洲日本欧美日韩高观看| 亚洲人成电影网站色xx| 中文字幕亚洲欧美一区二区三区| 亚洲女性裸体视频| 色婷婷**av毛片一区| 亚洲尤物视频网| 91精品国产综合久久男男| 亚洲欧美中文另类| 亚洲国产精品国自产拍av秋霞| 国产精品免费观看在线| 国产精品久久久久久av| 国产精品久久久久久久久久ktv| 日韩精品免费在线视频| 国产精品欧美一区二区三区奶水| 91精品国产高清久久久久久久久| 久久久久久亚洲精品| 亚洲最大的网站| 91久久久久久久久久| 国产精品一二三视频| 国产成人avxxxxx在线看| 亚洲韩国日本中文字幕| 国产日韩综合一区二区性色av| 久久久久久综合网天天| 亚洲欧美在线磁力| 欧美日韩国产综合新一区| 成人激情视频小说免费下载| 欧美午夜久久久| 欧美日韩国产色| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品色蜜蜜精品视频在线观看| 97精品国产97久久久久久| 黄色成人av在线| 在线观看欧美成人| 久久久91精品国产一区不卡| 国产精品aaaa| 中文字幕av一区二区三区谷原希美| 久久精品亚洲一区| 在线激情影院一区| 亚洲色图av在线| 欧美精品激情视频| 黄色一区二区在线| 97超碰蝌蚪网人人做人人爽| 蜜月aⅴ免费一区二区三区| 久久在精品线影院精品国产| 国产91网红主播在线观看| 国产中文日韩欧美| 日本道色综合久久影院| 欧美日韩国产色| 久久噜噜噜精品国产亚洲综合| 国产精品成熟老女人| 久久久成人精品| 国产一区二区精品丝袜| 一本大道香蕉久在线播放29| 精品亚洲一区二区三区在线播放| 日韩av免费在线观看| 国模私拍视频一区| 成人国产在线视频| 国产香蕉一区二区三区在线视频| 91精品国产自产在线观看永久| 亚洲第一区在线观看| 国产视频丨精品|在线观看| 成人精品一区二区三区电影黑人| 秋霞午夜一区二区| 国产伦精品一区二区三区精品视频| 亚洲国产成人一区| 亚洲综合第一页| 欧美激情欧美狂野欧美精品| 亚洲高清av在线| 2019亚洲男人天堂| 欧美在线影院在线视频| 黄色成人在线免费| 91免费人成网站在线观看18| 欧美在线观看www| 久久国产精品亚洲| 国产精品jvid在线观看蜜臀| 日韩高清a**址| 久久久久久久久久久人体| 久久久国产一区二区| 91tv亚洲精品香蕉国产一区7ujn| 国内精品模特av私拍在线观看| 91在线观看欧美日韩| 国产97在线视频| 97精品国产91久久久久久| 日韩精品在线第一页| 国产欧美久久久久久| 国产精品国产亚洲伊人久久| 久久精品在线播放| 亚洲激情小视频| 亚洲成人黄色网| 亚洲男人的天堂在线| 91免费精品国偷自产在线| 91中文字幕在线| 欧美视频在线观看免费网址| 亚洲欧美日韩在线高清直播| 国产91ⅴ在线精品免费观看| 91av视频在线| 欧美日韩在线视频观看| 精品亚洲永久免费精品| 久久精品国产亚洲7777| 欧美大片在线看免费观看| 亚洲女成人图区| 久久久久亚洲精品| 国产精品成人播放| 亚洲视频日韩精品| 中文字幕精品www乱入免费视频| 欧美日韩中文字幕在线| 久久久久在线观看| 欧美黑人性生活视频| 日韩激情视频在线播放| 亚洲二区在线播放视频| 亚洲欧洲一区二区三区在线观看| 亚洲第一区在线观看| 8090理伦午夜在线电影| 成人精品一区二区三区电影黑人| 9.1国产丝袜在线观看| 一区二区亚洲欧洲国产日韩| 欧美国产日韩免费| 欧美亚洲伦理www| 日韩精品免费综合视频在线播放| xxxx欧美18另类的高清| 色老头一区二区三区在线观看| 亚洲自拍偷拍一区| 久久97久久97精品免视看| 亚洲国产精品国自产拍av秋霞| 欧美激情在线播放| 成人激情视频在线播放| 国产精品视频免费在线| 最新亚洲国产精品| …久久精品99久久香蕉国产| 色狠狠av一区二区三区香蕉蜜桃| 欧美午夜性色大片在线观看| 亚洲黄色成人网| 97免费中文视频在线观看| 欧亚精品在线观看| 91免费精品国偷自产在线| 欧美片一区二区三区| 日本欧美在线视频|