a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > regex > 正文

正則表達(dá)式教程之位置匹配詳解

2020-01-20 22:03:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(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)匹配單詞的開始和結(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中連字符前后都沒有空格,所以能夠匹配,而color - coded中連字符前后都有空格,所以不能匹配。

三、字符串邊界

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

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

文本:

<?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è)字符串的開頭位置,所以^/s*將匹配一個(gè)字符串的開頭位置和隨后的零個(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ì)待。在多行匹配模式下,^不僅匹配正常的字符串開頭,還將匹配行分隔符(換行符)后面的開始位置,$不僅匹配正常的字符串結(jié)尾,還將匹配行分隔符(換行符)后面的結(jié)束位置。

在使用時(shí),(?m)必須出現(xiàn)在整個(gè)模式的最前面。比如,通過(guò)正則表達(dá)式把一段java代碼中的單行注釋(以//開始)內(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è)字符串的開始,然后是任意多個(gè)空白字符,再后面是//,再往后是任意文本,最后是一個(gè)字符串的結(jié)束。不過(guò)這個(gè)模式只能找出第一條注釋,加上(?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è)換行符處開頭或結(jié)尾的字符串。在接下來(lái)的文章中將介紹子表達(dá)式的使用。

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

JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.VeVB.COm/regex/javascript

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

希望本文所述對(duì)大家正則表達(dá)式學(xué)習(xí)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产av一级毛片 | 国产一区二区视频在线 | 亚洲成av人片在线观看 | 伊人av在线免费观看 | 久久亚洲天堂 | 国产精品中文字幕一区二区三区 | 亚洲视频在线观看 | 精品福利一区二区 | 国产亚洲欧美在线 | 亚洲成人一 | 色精品| 日韩欧美网 | 亚洲欧美一 | av黄色在线 | 中文字幕2021 | 成人欧美一区二区三区黑人孕妇 | 黄色影视免费观看 | 成人在线欧美 | a级毛片免费高清视频 | 亚洲精品一二三区 | 亚洲 精品 综合 精品 自拍 | 91精品国产一区二区 | 欧美不卡 | 国产精品久久久久久久久久 | 亚洲自拍偷拍电影 | 天天干天天操天天爽 | 黄色一级影视 | 国产精品国产三级国产aⅴ原创 | 国产视频第一区 | 欧美极品在线 | 91综合视频在线观看 | 久久久久久久久久久久久女国产乱 | 国产午夜小视频 | 国产一区二区三区久久久 | 国产一区二区三区免费 | 国产欧美日韩综合 | 欧美国产精品 | 亚洲国产午夜视频 | 69性欧美高清影院 | 久久久国产一区二区三区四区小说 | 日韩视频在线观看不卡 |