ホームページ  >  記事  >  ウェブフロントエンド  >  通常の位置マッチングの詳細説明

通常の位置マッチングの詳細説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-30 09:47:281688ブラウズ

今回は、通常の位置マッチングの使用方法について詳しく説明します。通常の位置マッチングを使用する場合の注意事項は何ですか?実際のケースを見てみましょう。

この記事の例では、正規表現チュートリアルの位置マッチングについて説明します。参考として、次のようにみんなと共有してください。

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

1. 問題の紹介

テキスト内の特定の単語を一致させたい場合 (後で紹介する複数行モードを今のところ無視します)、次のようになります。

テキスト:

昨日は歴史、明日はミステリー、しかし今日は贈り物です。

正規表現:

is

結果:

昨日【ある】 h【ある】物語、明日 【is】 a Mystery, but today 【is】 a gift.

分析: 元々は is という単語だけを一致させたかったのですが、他の単語に含まれる is とも一致しました。この問題を解決するには、境界区切り文字を使用します。つまり、正規表現内でいくつかの

メタキャラクター を使用して、一致操作を実行する場所 (または境界) を示します。

2. 単語の境界

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

テキスト:

昨日は歴史、明日は謎ですが、今日は贈り物です。

正規表現:

bisb

結果:

昨日【は】歴史、明日【is】 a Mystery, but today 【is】 a gift.

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

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

テキスト:

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

正規表現:

B-B

結果:

【9桁】を入力してください。 色分けされた ID [パスキー].分析: B-B は前後の単語境界ではないハイフンと一致します。 nine- のハイフンの前後にスペースはありません。数字とパスキーなので一致しますが、色分けされているハイフンの前後にスペースがあるため一致できません。

3.

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

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

テキスト:

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

正規表現:

^s*

结果:



分析:^匹配一个字符串的开头位置,所以^\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());
  }
}

输出结果如下:

//ダイアログ ボックスがモーダルであることを指定して、スーパー コンストラクターを呼び出します。
//ダイアログ ボックスのタイトルを設定します。
//「X」をクリックしてもウィンドウを閉じないよう指示します。
//素敵な境界線を持つメッセージを入力します。このダイアログ ボックス。
//ダイアログ ボックスのサイズをコンポーネントに合わせます。
//ダイアログ ボックスをアプリケーション上に中央に配置します。

5. 概要

正規表現は、任意の長さのテキスト ブロックを一致させるために使用できるだけでなく、次のようなテキスト ブロックと一致します。文字列内の特定の位置に出現します。 b は単語境界を指定するために使用されます (B はその逆です)。 ^ と $ は単語の境界を指定するために使用されます。 (?m) と一緒に使用すると、^ と $ は改行文字で始まるか終わる文字列にも一致します。部分式の使用については、次の記事で紹介します。

この記事の事例を読んだ後、あなたはその方法をマスターしたと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

正規表現チュートリアルの位置一致チュートリアル (コード付き)

JS パスワード強度検証正規表現 (コード付き)

以上が通常の位置マッチングの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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