首頁  >  文章  >  web前端  >  正規表示式教學的位置比對教學(附程式碼)

正規表示式教學的位置比對教學(附程式碼)

php中世界最好的语言
php中世界最好的语言原創
2018-03-29 18:03:131459瀏覽

這次帶給大家正規表示式教學的位置比對教學(附程式碼),使用正規表示式教學位置相符的注意事項有哪些,以下就是實戰案例,一起來看一下。

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

註:在所有例子中正規表示式匹配結果包含在源文本中的之間,有的例子會使用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 version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>

正则表达式:^\s*<\?xml.*?\?>

结果:



分析:^匹配一个字符串的开头位置,所以^\s*将匹配一个字符串的开头位置和随后的零个或多个空白字符,因为标签前面允许有空格、制表符、换行符等空白字符。

$元字符符的用法除了位置上的差异外,与^用法完全一样。比如,检查一个html页面是否以结尾,可以用模式:\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)搭配使用,^和$也會符合在一個換行符號處開頭或結尾的字串。在接下來的文章中將介紹子表達式的使用。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

正規怎麼符合連續數字

正規實作最小符合的開發經驗

以上是正規表示式教學的位置比對教學(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn