JavaRush /Blog Java /Random-MS /Ungkapan Biasa di Jawa, Bahagian 4

Ungkapan Biasa di Jawa, Bahagian 4

Diterbitkan dalam kumpulan
Kami menyampaikan kepada perhatian anda terjemahan panduan ringkas kepada ungkapan biasa dalam Java, yang ditulis oleh Jeff Friesen untuk tapak web javaworld . Untuk memudahkan pembacaan, kami telah membahagikan artikel tersebut kepada beberapa bahagian. Ungkapan Biasa dalam Java, Bahagian 4 - 1 Ungkapan Biasa di Jawa, Bahagian 1 Ungkapan Biasa di Jawa, Bahagian 2 Ungkapan Biasa di Jawa, Bahagian 3

Kaedah untuk bekerja dengan kumpulan yang ditangkap

Kod sumber aplikasi RegexDemotermasuk panggilan kaedah m.group(). Kaedah ini group()adalah salah satu daripada beberapa kaedah kelas Matcheryang bertujuan untuk bekerja dengan kumpulan yang ditangkap:
  • Kaedah ini int groupCount()mengembalikan bilangan kumpulan yang ditangkap dalam corak penyelesai. Nombor ini tidak mengambil kira nombor kumpulan tangkapan khas 0, yang sepadan dengan corak secara keseluruhan.

  • Kaedah ini String group()mengembalikan watak padanan sebelumnya yang ditemui. Untuk melaporkan carian yang berjaya untuk rentetan kosong, kaedah ini mengembalikan rentetan kosong. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini String group(int group)serupa dengan kaedah sebelumnya, kecuali ia mengembalikan aksara padanan sebelumnya, yang ditangkap oleh nombor kumpulan yang ditentukan oleh parameter group. Ambil perhatian bahawa ini group(0)bersamaan dengan group(). Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualian IndexOutOfBoundsException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini String group(String name)mengembalikan watak padanan sebelumnya yang ditemui, ditangkap oleh kumpulan nama. Jika nama kumpulan yang ditangkap tiada dalam templat, pengecualian akan dilemparkan IllegalArgumentException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

Contoh berikut menunjukkan penggunaan kaedah groupCount()dan group(int group):
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Keputusan pelaksanaan:
3
0: abc
1: abc
2: bc
3: c
Ungkapan Biasa dalam Java, Bahagian 4 - 2

Kaedah untuk menentukan kedudukan perlawanan

Kelas Matchermenyediakan beberapa kaedah yang mengembalikan kedudukan permulaan dan penamat perlawanan:
  • Kaedah ini int start()mengembalikan kedudukan permulaan perlawanan sebelumnya yang ditemui. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini int start(int group)serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan permulaan padanan sebelumnya yang ditemui untuk kumpulan yang nombornya ditentukan oleh parameter group. Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualian IndexOutOfBoundsException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini int start(String name)serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan permulaan perlawanan sebelumnya yang ditemui untuk kumpulan yang dipanggil name. Jika kumpulan yang ditangkap nametiada dalam templat, pengecualian akan dilemparkan IllegalArgumentException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini int end()mengembalikan kedudukan aksara terakhir padanan sebelumnya yang ditemui tambah 1. Jika pemadan belum melakukan perlawanan atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini int end(int group)serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan akhir padanan sebelumnya yang ditemui untuk kumpulan yang nombornya ditentukan oleh parameter group. Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualian IndexOutOfBoundsException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

  • Kaedah ini int end(String name)serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan penamat pada perlawanan sebelumnya yang ditemui untuk kumpulan yang dipanggil name. Jika kumpulan yang ditangkap nametiada dalam templat, pengecualian akan dilemparkan IllegalArgumentException. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkan IllegalStateException.

Contoh berikut menunjukkan dua kaedah lokasi perlawanan yang mengeluarkan kedudukan padanan mula/akhir untuk kumpulan tangkap nombor 2:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
Output contoh ini adalah seperti berikut:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

Kaedah kelas PatternSyntaxException

Contoh kelas PatternSyntaxExceptionmenerangkan ralat sintaks dalam ungkapan biasa. Melemparkan pengecualian sedemikian daripada kaedah compile()dan matches()kelas Pattern, dan dibentuk melalui pembina berikut: PatternSyntaxException(String desc, String regex, int index) Pembina ini menyimpan penerangan yang ditentukan ( desc), ungkapan biasa ( regex), dan kedudukan di mana ralat sintaks berlaku. Jika lokasi ralat sintaks tidak diketahui, nilai indexditetapkan kepada -1. Kemungkinan besar, anda tidak perlu membuat contoh PatternSyntaxException. Walau bagaimanapun, anda perlu mengekstrak nilai di atas apabila membuat mesej ralat terformat. Untuk melakukan ini, anda boleh menggunakan kaedah berikut:
  • Kaedah ini String getDescription()mengembalikan penerangan tentang ralat sintaks.
  • Kaedah int getIndex()mengembalikan sama ada kedudukan di mana ralat berlaku, atau -1 jika kedudukan tidak diketahui.
  • Kaedah ini String getPattern()mengembalikan ungkapan biasa yang tidak sah.
Selain itu, kaedah yang diwarisi String getMessage()mengembalikan rentetan berbilang baris dengan nilai yang dikembalikan daripada kaedah sebelumnya bersama-sama dengan petunjuk visual tempat ralat sintaks berlaku dalam templat. Apakah ralat sintaks? Berikut ialah contoh: java RegexDemo (?itree Treehouse Dalam kes ini, kami terlupa untuk menentukan metacharacter kurungan penutup ( )) dalam ungkapan bendera bersarang. Inilah yang dihasilkan daripada ralat ini:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Bina Aplikasi Ekspresi Biasa Berguna Menggunakan API Regex

Ungkapan biasa membolehkan anda mencipta aplikasi pemprosesan teks yang berkuasa. Dalam bahagian ini, kami akan menunjukkan kepada anda dua aplikasi berguna yang diharapkan akan menggalakkan anda untuk meneroka kelas dan kaedah API Regex dengan lebih lanjut. Lampiran kedua memperkenalkan Lexan: perpustakaan kod yang boleh digunakan semula untuk melaksanakan analisis leksikal. Ungkapan Biasa di Jawa, Bahagian 4 - 3

Ekspresi biasa dan dokumentasi

Dokumentasi adalah salah satu tugas wajib apabila membangunkan perisian profesional. Nasib baik, ungkapan biasa boleh membantu anda dengan banyak aspek penciptaan dokumentasi. Kod dalam Penyenaraian 1 mengekstrak baris yang mengandungi komen gaya C satu baris dan berbilang baris daripada fail sumber dan menulisnya ke fail lain. Untuk kod berfungsi, ulasan mesti berada pada baris yang sama. Penyenaraian 1. Mendapatkan semula komen
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Howая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
Kaedah main()dalam Penyenaraian 1 mula-mula menyemak sintaks baris perintah yang betul dan kemudian menyusun ungkapan biasa yang direka untuk mengesan komen tunggal dan berbilang baris ke dalam objek kelas Pattern. Jika tiada pengecualian dibangkitkan PatternSyntaxException, kaedah main()membuka fail sumber, mencipta fail sasaran, memperoleh pemadan untuk memadankan setiap baris yang dibaca dengan corak, dan kemudian membaca fail sumber baris demi baris. Untuk setiap baris, ia dipadankan dengan corak ulasan. Jika berjaya, kaedah main()menulis rentetan (diikuti dengan baris baharu) ke fail sasaran (kami akan merangkumi logik I/O fail dalam tutorial Java 101 akan datang). Susun Penyenaraian 1 seperti berikut: javac ExtCmnt.java Jalankan aplikasi dengan fail ExtCmnt.javasebagai input: java ExtCmnt ExtCmnt.java out Anda harus mendapatkan hasil berikut dalam fail keluar:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Dalam rentetan corak .*/\\*.*\\*/|.*//.*$, metacharacter paip |bertindak sebagai operator OR logik, menunjukkan bahawa pemadan harus menggunakan operan kiri binaan ungkapan biasa yang diberikan untuk mencari padanan dalam teks pemadan. Jika tiada padanan, pemadan menggunakan operan yang betul daripada binaan ungkapan biasa yang diberikan untuk percubaan carian lain (metakarakter kurungan dalam kumpulan yang ditangkap juga membentuk operator logik). Ungkapan Biasa di Jawa, Bahagian 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION