ホームページ  >  記事  >  バックエンド開発  >  正規表現チュートリアルでの位置一致の詳細な説明

正規表現チュートリアルでの位置一致の詳細な説明

高洛峰
高洛峰オリジナル
2017-01-09 16:45:221969ブラウズ

この記事の例では、正規表現チュートリアルの位置一致について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

注: すべての例では、正規表現の一致結果がソース テキストの [and] の間に含まれています。一部の例は Java を使用して実装されます。 Java 自体の正規表現 式の使用法については該当箇所で説明します。すべての Java サンプルは JDK1.6.0_13 でテストされています。

1. 問題の概要

テキスト内の特定の単語を一致させたい場合は、次のようになります (後で紹介する複数行モードは考慮していません)。テキスト: 昨日は歴史、明日は謎、しかし今日は贈り物です。

正規表現: is

結果: 昨日は [は] 歴史、明日は [は] ミステリー、しかし今日は [は] a Gift.

分析: 元々は、単語 is に一致するだけでしたが、他の単語にも含まれています。この問題を解決するには、境界区切り文字を使用します。境界区切り文字は、一致操作を実行する場所 (または境界) を示すために正規表現で使用されるメタ文字です。

2. 単語境界

一般的に使用される境界は、修飾子 b によって指定される単語境界であり、単語の先頭と末尾を一致させるために使用されます。より正確には、単語の形成に使用できる文字 (文字、数字、アンダースコア、w に一致する文字) と単語の形成に使用できない文字 (W は文字に一致) の間の位置と一致します。 。前の例を見てみましょう:

テキスト: 昨日は歴史、明日は謎、しかし今日は贈り物です。

正規表現: bisb

結果: 昨日は歴史、明日は謎、しかしtoday 【is】 a gift.

分析: 原文では、単語 is の前後にスペースがあり、これはパターン bisb と一致します (スペースは単語を区切る文字の 1 つです)。 History という単語には、その前後に h と t という 2 つの文字があるため、is も含まれます。これら 2 つの文字はいずれも b と一致しません。

単語の境界が一致しない場合は、B が使用されます。例:

テキスト: 色分けされたパスキーに表示されている 9 桁の ID を入力してください。

正規表現: B-B

結果: パスキーに表示されている [9 桁の] ID を入力してください。色分けされた [パスキー]

分析: B-B は前後の単語の境界ではないハイフンと一致します。9 桁のハイフンとパスキーの前後にはスペースがありません。色分けされている間は一致しました ハイフンの前後にスペースがあるため、一致することはできません。

3. 文字列境界

単語境界は、単語に関連する位置 (単語の先頭、単語の末尾、単語全体など) を一致させるために使用できます。文字列境界にも同様の目的がありますが、文字列に関連する位置 (文字列の先頭、文字列の末尾、文字列全体など) を一致させるために使用されます。文字列の境界を定義するために使用されるメタ文字は 2 つあります。1 つは文字列の先頭を定義するために使用される ^ で、もう 1 つは文字列の終わりを定義するために使用される $ です。

たとえば、XML ドキュメントの合法性をチェックしたい場合、合法な XML ドキュメントはすべて 0105cfce27a504b8c96b17cc10dac237 で始まります

結果:

e5c4a04750e14c7e71d196054342cbf1

d64afd77c8fcd326557d877e6ba7f0cd

分析: ^ は文字列の先頭に一致するため、^s* は8a82eb472d64dd53782fcc091813a312 タグはスペース、タブ、改行などの空白文字を先頭に使用できるため、文字列の先頭とそれに続く 0 個以上の空白文字と一致します。

$ メタキャラクターの使用法は、位置の違いを除いて ^ の使用法とまったく同じです。たとえば、HTML ページが 73a6ac4ed44ffec12cee46588e518a5e で終わるかどうかを確認するには、パターン afffb3cd0bb4596915bc8423c6ca1968s*$

4 を使用できます。パターンの一致

正規表現では、いくつかの特別なメタキャラクターを使用して、他のメタキャラクターの動作を変更できます。複数行一致モードは (?m) によって有効にできます。複数行の一致パターンにより、正規表現エンジンは行区切り文字を文字列区切り文字として扱います。複数行一致モードでは、 ^ は文字列の通常の先頭に一致するだけでなく、行区切り文字 (改行文字) の後の開始位置にも一致します。 $ は文字列の通常の末尾に一致するだけでなく、行区切り文字にも一致します。 (改行文字) の後ろの終了位置。

使用する場合は、パターン全体の先頭に(?m)を表示する必要があります。たとえば、正規表現を使用して、Java コード内のすべての単一行コメント (// で始まる) を検索します。

テキスト:

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

正規表現: (?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中文网!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。