JavaRush /Java blogi /Random-UZ /Java tilidagi oddiy iboralar, 4-qism

Java tilidagi oddiy iboralar, 4-qism

Guruhda nashr etilgan
Sizning e'tiboringizga Jeff Friesen tomonidan javaworld veb-sayti uchun yozilgan Java tilidagi muntazam iboralar bo'yicha qisqacha qo'llanmaning tarjimasini taqdim etamiz . O'qish qulayligi uchun biz maqolani bir necha qismga ajratdik. Java tilidagi oddiy iboralar, 4-1-qism Java tilidagi oddiy iboralar, 1-qism Java tilidagi oddiy iboralar, 2-qism Java tilidagi oddiy iboralar, 3-qism

Qo'lga olingan guruhlar bilan ishlash usullari

Ilovaning manba kodi RegexDemousul chaqiruvini o'z ichiga oladi m.group(). Usul qo'lga olingan guruhlar bilan ishlashga qaratilgan group()sinfning bir nechta usullaridan biridir :Matcher
  • Usul int groupCount()rezolyutsiya sxemasida olingan guruhlar sonini qaytaradi. Bu raqam 0-sonli maxsus qo'lga olish guruhini hisobga olmaydi, bu umuman naqshga mos keladi.

  • Usul String group()oldingi topilgan mos belgilarni qaytaradi. Bo'sh qatorni muvaffaqiyatli qidirish haqida xabar berish uchun bu usul bo'sh qatorni qaytaradi. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul String group(int group)avvalgi usulga o'xshaydi, bundan tashqari, u parametr tomonidan ko'rsatilgan guruh raqami tomonidan olingan oldingi topilgan mos keladigan belgilarni qaytaradi group. E'tibor bering, bu group(0)ga teng group(). Agar shablonda berilgan raqam bilan olingan guruh bo'lmasa, usul istisno qiladi IndexOutOfBoundsException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul String group(String name)nom guruhi tomonidan qo'lga kiritilgan oldingi mos keladigan belgilarni qaytaradi. Agar qo'lga kiritilgan guruh nomi shablonda bo'lmasa, istisno chiqariladi IllegalArgumentException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

groupCount()Quyidagi misol va usullaridan foydalanishni ko'rsatadi 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));
Amalga oshirish natijalari:
3
0: abc
1: abc
2: bc
3: c
Java tilidagi oddiy ifodalar, 4-2-qism

O'yin pozitsiyalarini aniqlash usullari

Sinf Matchero'yinning boshlang'ich va yakuniy pozitsiyalarini qaytaradigan bir nechta usullarni taqdim etadi:
  • Usul int start()avvalgi topilgan o'yinning boshlang'ich pozitsiyasini qaytaradi. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul int start(int group)avvalgi usulga o'xshaydi, lekin soni parametr bilan ko'rsatilgan guruh uchun topilgan oldingi moslikning boshlang'ich pozitsiyasini qaytaradi group. Agar shablonda berilgan raqamga ega bo'lgan guruh bo'lmasa, usul istisno qiladi IndexOutOfBoundsException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul int start(String name)avvalgi usulga o'xshaydi, lekin deb nomlangan guruh uchun oldingi o'yinning boshlang'ich pozitsiyasini qaytaradi name. Agar qo'lga olingan guruh nameshablonda bo'lmasa, istisno chiqariladi IllegalArgumentException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul int end()oldingi topilgan moslikning oxirgi belgisi o'rnini va 1 qo'shimchasini qaytaradi. Agar mos keluvchi hali o'yinni bajarmagan bo'lsa yoki oldingi qidiruv operatsiyasi bajarilmasa, istisno chiqariladi IllegalStateException.

  • Usul int end(int group)avvalgi usulga o'xshaydi, lekin soni parametr bilan ko'rsatilgan guruh uchun oldingi moslikning yakuniy pozitsiyasini qaytaradi group. Agar shablonda berilgan raqam bilan olingan guruh bo'lmasa, usul istisno qiladi IndexOutOfBoundsException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

  • Usul int end(String name)avvalgi usulga o'xshaydi, lekin deb nomlangan guruh uchun topilgan oldingi o'yinning yakuniy pozitsiyasini qaytaradi name. Agar qo'lga olingan guruh nameshablonda bo'lmasa, istisno chiqariladi IllegalArgumentException. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladi IllegalStateException.

Quyidagi misolda 2-sonli suratga olish guruhi uchun boshlang'ich/oxirgi moslik pozitsiyalarini chiqaradigan ikkita mos joylashuv usuli ko'rsatilgan:
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();
}
Ushbu misolning natijasi quyidagicha:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

PatternSyntaxException sinfining usullari

Sinf namunasi PatternSyntaxExceptionmuntazam ifodadagi sintaksis xatosini tasvirlaydi. Metodlar compile()va matches()sinfdan bunday istisnoni tashlaydi Patternva quyidagi konstruktor orqali hosil bo'ladi: PatternSyntaxException(String desc, String regex, int index) Bu konstruktor belgilangan tavsifni ( desc), muntazam ifodani ( regex) va sintaksis xatosi sodir bo'lgan pozitsiyani saqlaydi. Sintaksis xatosining joylashuvi noma'lum bo'lsa, qiymat indexga o'rnatiladi -1. Ehtimol, siz hech qachon nusxalarini yaratishingiz shart emas PatternSyntaxException. Biroq, formatlangan xato xabarini yaratishda yuqoridagi qiymatlarni chiqarib olishingiz kerak bo'ladi. Buning uchun siz quyidagi usullardan foydalanishingiz mumkin:
  • Usul String getDescription()sintaksis xatosining tavsifini qaytaradi.
  • Usul int getIndex()xato sodir bo'lgan pozitsiyani yoki pozitsiya noma'lum bo'lsa -1ni qaytaradi.
  • Usul String getPattern()yaroqsiz muntazam ifodani qaytaradi.
Bundan tashqari, meros qilib olingan usul String getMessage()oldingi usullardan qaytarilgan qiymatlar bilan ko'p qatorli qatorni qaytaradi va shablonda sintaksis xatosi qaerda sodir bo'lganligini vizual ko'rsatadi. Sintaksis xatosi nima? Mana bir misol: java RegexDemo (?itree Treehouse Bu holda biz )ichki bayroq ifodasida yopish qavs meta-belgisini ( ) belgilashni unutdik. Bu xatolikdan chiqadigan narsa:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API yordamida foydali oddiy ifoda ilovalarini yarating

Oddiy iboralar matnni qayta ishlash uchun kuchli ilovalar yaratish imkonini beradi. Ushbu bo'limda biz sizga Regex API sinflari va usullarini yanada o'rganishga undaydigan ikkita qulay dasturni ko'rsatamiz. Ikkinchi ilova Lexan bilan tanishtiradi: leksik tahlil qilish uchun qayta foydalanish mumkin bo'lgan kodlar kutubxonasi. Java tilidagi oddiy iboralar, 4-3-qism

Oddiy iboralar va hujjatlar

Hujjatlar professional dasturiy ta'minotni ishlab chiqishda majburiy vazifalardan biridir. Yaxshiyamki, muntazam iboralar sizga hujjatlarni yaratishning ko'p jihatlarida yordam berishi mumkin. Listing 1-dagi kod bir qatorli va ko'p qatorli C uslubidagi izohlarni o'z ichiga olgan qatorlarni manba faylidan chiqaradi va ularni boshqa faylga yozadi. Kod ishlashi uchun sharhlar bir xil satrda bo'lishi kerak. Listing 1. Sharhlarni olish
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;
      }
   }
}
Listing 1-dagi usul main()birinchi navbatda to'g'ri buyruq qatori sintaksisini tekshiradi va keyin sinf ob'ektidagi bir va ko'p qatorli sharhlarni aniqlash uchun mo'ljallangan muntazam ifodani kompilyatsiya qiladi Pattern. Agar istisno ko'tarilmasa PatternSyntaxException, usul main()manba faylini ochadi, maqsadli faylni yaratadi, o'qilgan har bir satrni naqshga moslashtirish uchun moslashtiruvchini oladi va keyin manba faylni satr bo'yicha o'qiydi. Har bir satr uchun u sharh namunasi bilan mos keladi. Muvaffaqiyatli bo'lsa, usul main()maqsad faylga satrni (keyin yangi qator) yozadi (biz kelajakdagi Java 101 qo'llanmasida fayl kiritish/chiqarish mantiqini ko'rib chiqamiz). Listing 1 ni quyidagicha kompilyatsiya qiling: javac ExtCmnt.java Ilovani fayl bilan ExtCmnt.javakirish sifatida ishga tushiring: java ExtCmnt ExtCmnt.java out Fayl chiqarishda quyidagi natijalarni olishingiz kerak:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Naqsh qatorida .*/\\*.*\\*/|.*//.*$quvur meta-belgi |mantiqiy OR operatori vazifasini bajaradi, bu moslashtiruvchi matnda moslikni topish uchun berilgan muntazam ifoda konstruktsiyasining chap operandidan foydalanishi kerakligini ko'rsatadi. Agar mos kelmaydigan bo'lsa, mos keluvchi boshqa qidiruv urinishi uchun berilgan muntazam ifoda konstruktsiyasidan to'g'ri operanddan foydalanadi (qo'lga olingan guruhdagi qavs meta-belgilari ham mantiqiy operatorni tashkil qiladi). Java tilidagi oddiy iboralar, 5-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION