ホームページ  >  記事  >  Java  >  Java は文字列マッチングを実装します (規則性に基づいて)

Java は文字列マッチングを実装します (規則性に基づいて)

高洛峰
高洛峰オリジナル
2017-01-16 11:05:091724ブラウズ

文字列があります。その中に y 文字と f 文字があるかどうかをクエリするにはどうすればよいですか?最も暗い方法は次のとおりです:

プログラム 1: if、for ステートメント、charAt() はわかります

class Test{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  char x='y';
  char y='f';
  boolean result=false;
  for(int i=0;i<str.length;i++){
   char z=str.charAt(i); //System.out.println(z);
   if(x==z||y==z) {
    result=true;
    break;
   }
   else result=false;
  }
  System.out.println(result);
 }
}

非常に直感的に思えますが、この方法は複雑な作業に対処するのが困難です。たとえば、テキストの中に があるかどうかをクエリします。何かあるのか、とか。嫌な仕事だ。

Java の java.util.regex パッケージ

オブジェクト指向の考え方に従うと、is、thing、ting などのクエリしたい文字列をオブジェクトにカプセル化し、このオブジェクトを照合するテンプレートとして使用する方が自然です。テキストの一部。テンプレートとなるのが、後述する正規表現です。複雑さを無視して例を見てみましょう。 プログラム 2: わかりません。まずは見てみましょうか?

import java.util.regex.*;
 
class Regex1{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  String regEx="a|f"; //表示a或f
  Pattern p=Pattern.compile(regEx);
  Matcher m=p.matcher(str);
  boolean result=m.find();
  System.out.println(result);
 }
}

str が regEx と一致する場合、result は true、それ以外の場合は false になります。大文字と小文字を無視して検索したい場合は、次のように記述できます:

Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

Pattern (テンプレート、パターン) と Matcher (マッチャー) の詳細はまだ不明ですが、 , 最初に is をクエリし、その後で thing または ting をクエリすると、if ステートメントや for ステートメントを考慮したり、charAt() を使用したりする代わりに、テンプレートのパターンを変更するだけで済むため、プログラムはより快適になります。

1. 特殊な文字列 - a|f などの正規表現を記述します。

2. 正規表現をテンプレートにコンパイルします: p

3. テンプレート p を使用して文字列 str と一致します。

アイデアは明確になったので、Java がそれをどのように処理するかを見てみましょう (Java プログラマーは、JDK1.4 までこれらのクラスを使用できません。

Pattern クラスと検索

①パブリック最終クラス java.util.regex.Pattern はコンパイル後の正規表現です) Expression. 次のステートメントは、Pattern オブジェクトを作成し、それをハンドル p に割り当てます: Pattern p=Pattern.compile(regEx);

興味深いことに、Pattern クラスは最終クラスであり、そのコンストラクターはプライベートです。パターンを設計するか、関連情報を自分で確認してください。結論としては、Pattern クラスは継承できず、new を介して Pattern クラスのオブジェクトを作成することはできません。そのため、Pattern クラスの戻り値には 2 つのオーバーロードが提供されます。 value は、Pattern オブジェクト (参照) のようなものです。

public static Pattern compile(String regex) {
 return new Pattern(regex, 0);
}

もちろん、Pattern p=null のように、Pattern クラスのハンドルを宣言することもできます。 ②p.matcher(str) は、p が生成するテンプレートでそれを表します。文字列 str のマッチャーであり、その戻り値は Matcher クラスへの参照です。なぜこれが必要なのでしょうか? 当然の考えによれば、次のメソッドを使用するだけで済みます。

次のようにコードをコピーします:

boolean result=Pattern.compile(regEx).matcher(str).find();


実際、これは 3 つのステートメントをマージするハンドルレスの方法です。良い方法です。Matcher クラスについては後で学びましょう。まず regEx を見てみましょう。 正規表現とは、文字列を生成する文字列です。 me+ は、me、mee、meee、meeeeeeeee などを生成できます。正規表現は無限の文字列を生成する可能性があるため、正規表現によって生成されたものをすべて出力することはできません (必要ですか?)。考えてみると、言語を使用することはできますか。文字列を記述する: me、mee、meee、meeeeeeeee など。明らかに、正規表現言語ですか。いくつかの文字列パターンを簡潔かつ奥深く説明する言語です。

文字列の検索、一致、指定された文字列の置換に正規表現を使用します。

文字列を生成するための正規表現は少し複雑です。これは、文字列を通常の文字 (a から z までの文字など) と特殊文字 (メタキャラクターと呼ばれる) で正確に記述する必要があるためです。

まず正規表現の例をいくつか見てみましょう:

プログラム 3: 正規表現をテストするために常にこのプログラムを使用します

import java.util.regex.*;
 
class Regex1{
 public static void main(String args[]) {
  String str="For my money, the important thing ";
  String regEx="ab*";
  boolean result=Pattern.compile(regEx).matcher(str).find();
  System.out.println(result);
 }
}//ture

①"ab*" - a、ab、abb、abbb... に一致します。したがって、* は、前の文字が 0 回以上出現できることを意味します。検索のみを考慮する場合は、「a」を直接使用してください。しかし、交換の状況を考えてください。 regEx="abb*" という質問の結果は何ですか?

②「ab+」——ab、abb、abbb...に一致します。 「abb*」と同等。質問 regEx="or+" の結果は何ですか?

③「or?」——oとorに一致します。 ? は、前の文字が 0 回または 1 回出現できることを意味します。

これらの修飾子 *、+、? は、前の文字 (部分文字列) が出現する回数を便宜的に表します (説明するには {} を使用します): x*、0 回以上 ≡{0,}

上記は、この記事の内容全体は、正規表現の力を誰もが理解できるようにすることを目的としています。

Java での文字列マッチング (通常のルールに基づく) に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

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