JavaRush /Java блогы /Random-KK /Java тіліндегі тұрақты өрнектер, 4-бөлім

Java тіліндегі тұрақты өрнектер, 4-бөлім

Топта жарияланған
Сіздердің назарларыңызға Джефф Фризеннің javaworld веб-сайты үшін жазған Java тіліндегі тұрақты өрнектерге арналған қысқаша нұсқаулықтың аудармасын ұсынамыз . Оқуға ыңғайлы болу үшін мақаланы бірнеше бөлікке бөлдік. Java тіліндегі тұрақты өрнектер, 4 - 1 бөлім Java тіліндегі тұрақты өрнектер, 1 бөлім Java тіліндегі тұрақты өрнектер, 2 бөлім Java тіліндегі тұрақты өрнектер, 3 бөлім

Ұсталған топтармен жұмыс істеу әдістері

Қолданбаның бастапқы codeы RegexDemoәдіс шақыруын қамтиды m.group(). Әдіс - ұсталған топтармен жұмыс істеуге бағытталған group()сыныптың бірнеше әдістерінің бірі :Matcher
  • Әдіс int groupCount()шешуші үлгісіндегі түсірілген топтардың санын қайтарады. Бұл сан тұтастай үлгіге сәйкес келетін арнайы түсіру тобының 0 нөмірін есепке алмайды.

  • Әдіс String group()алдыңғы табылған сәйкестіктің таңбаларын қайтарады. Бос жолды сәтті іздеу туралы хабарлау үшін бұл әдіс бос жолды қайтарады. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс String group(int group)алдыңғы әдіске ұқсас, тек ол параметрмен көрсетілген топ нөмірі арқылы түсірілген алдыңғы сәйкестіктің таңбаларын қайтарады group. Бұл group(0)сәйкес келетініне назар аударыңыз group(). Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарады IndexOutOfBoundsException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс String group(String name)атау тобымен түсірілген алдыңғы сәйкестіктің таңбаларын қайтарады. Түсірілген топ атауы үлгіде болмаса, ерекше жағдай шығарылады IllegalArgumentException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

groupCount()Келесі мысал және әдістерінің қолданылуын көрсетеді 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));
Орындау нәтижелері:
3
0: abc
1: abc
2: bc
3: c
Java тіліндегі тұрақты өрнектер, 4 - 2 бөлім

Сәйкестік позицияларын анықтау әдістері

Класс Matcherсәйкестіктің бастапқы және соңғы орындарын қайтаратын бірнеше әдістерді ұсынады:
  • Әдіс int start()алдыңғы табылған сәйкестіктің бастапқы орнын қайтарады. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс int start(int group)алдыңғы әдіске ұқсас, бірақ саны параметрмен көрсетілген топ үшін табылған алдыңғы сәйкестіктің бастапқы орнын қайтарады group. Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарады IndexOutOfBoundsException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс int start(String name)алдыңғы әдіске ұқсас, бірақ деп аталатын топ үшін табылған алдыңғы сәйкестіктің бастапқы орнын қайтарады name. Егер түсірілген топ nameүлгіде болмаса, ерекше жағдай шығарылады IllegalArgumentException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс int end()алдыңғы табылған сәйкестіктің соңғы таңбасының орнын және 1 санын қайтарады. Сәйкестік әлі сәйкестікті орындамаса немесе алдыңғы іздеу әрекеті сәтсіз болса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс int end(int group)алдыңғы әдіске ұқсас, бірақ саны параметрмен көрсетілген топ үшін табылған алдыңғы сәйкестіктің аяқталу орнын қайтарады group. Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарады IndexOutOfBoundsException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

  • Әдіс int end(String name)алдыңғы әдіске ұқсас, бірақ деп аталатын топ үшін табылған алдыңғы сәйкестіктің аяқталу орнын қайтарады name. Егер түсірілген топ nameүлгіде болмаса, ерекше жағдай шығарылады IllegalArgumentException. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарылады IllegalStateException.

Келесі мысал түсіру тобының нөмірі 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();
}
Бұл мысалдың нәтижесі келесідей:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

PatternSyntaxException класының әдістері

Сынып данасы PatternSyntaxExceptionтұрақты өрнектегі синтаксистік қатені сипаттайды. Мұндай ерекшелікті әдістер compile()мен matches()сыныптан шығарады Patternжәне келесі конструктор арқылы қалыптасады: PatternSyntaxException(String desc, String regex, int index) Бұл конструктор көрсетілген сипаттаманы ( desc), тұрақты өрнекті ( regex) және синтаксистік қате орын алған орынды сақтайды. Синтаксистік қатенің орны белгісіз болса, мән мәніне indexорнатылады -1. Сірә, сізге ешқашан даналарын жасаудың қажеті болмайды PatternSyntaxException. Дегенмен, пішімделген қате туралы хабарды жасаған кезде жоғарыдағы мәндерді шығарып алуыңыз керек. Ол үшін келесі әдістерді қолдануға болады:
  • Әдіс String getDescription()синтаксистік қатенің сипаттамасын береді.
  • Әдіс int getIndex()қате орын алған орынды немесе позиция белгісіз болса -1 қайтарады.
  • Әдіс String getPattern()жарамсыз тұрақты өрнекті қайтарады.
Бұған қоса, мұраланған әдіс String getMessage()үлгідегі синтаксистік қатенің қай жерде орын алғанының көрнекі көрсеткішімен бірге алдыңғы әдістерден қайтарылған мәндері бар көп жолды жолды қайтарады. Синтаксистік қате дегеніміз не? Міне мысал: Бұл жағдайда біз кірістірілген жалауша өрнегінде java RegexDemo (?itree Treehouse жабу жақша метатаңбасын ( ) көрсетуді ұмытып кеттік . )Бұл қатеден шығатын нәрсе:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API арқылы пайдалы тұрақты өрнек қолданбаларын құрастырыңыз

Тұрақты өрнектер қуатты мәтінді өңдеу қолданбаларын жасауға мүмкіндік береді. Бұл бөлімде біз сізге Regex API сыныптары мен әдістерін одан әрі зерттеуге шақыратын екі ыңғайлы қолданбаны көрсетеміз. Екінші қосымшада Lexan: лексикалық талдауды орындауға арналған қайта пайдалануға болатын code кітапханасы енгізілген. Java тіліндегі тұрақты өрнектер, 4 - 3 бөлім

Тұрақты өрнектер және құжаттама

Кәсіби бағдарламалық қамтамасыз етуді әзірлеу кезінде құжаттамалық қамтамасыз ету міндетті міндеттердің бірі болып табылады. Бақытымызға орай, тұрақты өрнектер құжаттаманы жасаудың көптеген аспектілерімен көмектесе алады. 1-тізімдегі code бастапқы файлдан бір жолды және көп жолды C стиліндегі түсініктемелерді қамтитын жолдарды шығарып, оларды басқа файлға жазады. Код жұмыс істеуі үшін түсініктемелер бір жолда болуы керек. Листинг 1. Түсініктемелерді алу
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;
      }
   }
}
1-тізімдегі әдіс main()алдымен пәрмен жолы синтаксисінің дұрыстығын тексереді, содан кейін сынып нысанындағы бір және көп жолды түсініктемелерді анықтауға арналған тұрақты өрнекті құрастырады Pattern. Ешбір ерекшелік туындамаса PatternSyntaxException, әдіс main()бастапқы файлды ашады, мақсатты файлды жасайды, үлгіге қарсы оқылған әрбір жолды сәйкестендіру үшін сәйкестікті алады, содан кейін бастапқы файлды жол бойынша оқиды. Әрбір жол үшін ол түсініктеме үлгісімен сәйкестендіріледі. Сәтті болса, әдіс main()мақсатты файлға жолды (жаңа жолдан кейін) жазады (біз болашақ Java 101 оқулығында файл енгізу/шығару логикасын қарастырамыз). 1-тізімді төмендегідей құрастырыңыз: javac ExtCmnt.java Қолданбаны файлмен ExtCmnt.javaкіріс ретінде іске қосыңыз: java ExtCmnt ExtCmnt.java out Файлдан келесі нәтижелерді алуыңыз керек:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Үлгі жолында .*/\\*.*\\*/|.*//.*$құбыр метатаңбасы |логикалық НЕМЕСЕ операторы ретінде әрекет етеді, бұл сәйкестендіруші сәйкестік мәтінінде сәйкестікті табу үшін берілген тұрақты өрнек конструкциясының сол жақ операндын пайдалану керектігін көрсетеді. Сәйкестіктер болмаса, сәйкестік басқа іздеу әрекеті үшін берілген тұрақты өрнек конструкциясынан дұрыс операндты пайдаланады (түсірілген топтағы жақша метатаңбалары да логикалық операторды құрайды). Java тіліндегі тұрақты өрнектер, 5-бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION