JavaRush /Java Blog /Random-TK /Java-da yzygiderli aňlatmalar, 4-nji bölüm

Java-da yzygiderli aňlatmalar, 4-nji bölüm

Toparda çap edildi
Jeff Frieseniň javaworld web sahypasy üçin ýazan Java-da yzygiderli aňlatmalar üçin gysga gollanmanyň terjimesini size hödürleýäris . Okamagyň aňsatlygy üçin makalany birnäçe bölege böldük. Java-da yzygiderli aňlatmalar, 4-nji bölüm Java-da yzygiderli aňlatmalar, 1-nji bölüm Java-da yzygiderli aňlatmalar, 2-nji bölüm Java-da yzygiderli aňlatmalar, 3-nji bölüm

Alnan toparlar bilen işlemegiň usullary

Programmanyň deslapky kody RegexDemousul jaňyny öz içine alýar m.group(). Bu usul, tutulan toparlar bilen işlemäge gönükdirilen group()synpyň birnäçe usullaryndan biridir :Matcher
  • Usul int groupCount()çözüji nagyşda tutulan toparlaryň sanyny yzyna gaýtaryp berýär. Bu san, tutuşlygyna nagşa gabat gelýän 0 sany ýörite topar toparyny göz öňünde tutmaýar.

  • Usul String group()tapylan öňki oýnuň nyşanlaryny yzyna gaýtaryp berýär. Boş setiriň üstünlikli gözlegini habar bermek üçin bu usul boş setiri yzyna gaýtaryp berýär. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • String group(int group)Usul, parametr bilen görkezilen topar belgisi tarapyndan düşürilen öňki tapylan nyşanlary yzyna gaýtaryp bermekden başga usul bilen öňki usula meňzeýär group. Munuň group(0)bilen deňdigine üns beriň group(). Şablonda berlen san bilen tutulan topar ýok bolsa, usul kadadan çykma döredýär IndexOutOfBoundsException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul String group(String name), at topary tarapyndan düşürilen öňki oýnuň nyşanlaryny yzyna gaýtaryp berýär. Alnan toparyň ady şablonda ýok bolsa, kadadan çykma atylýar IllegalArgumentException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

groupCount()Aşakdaky mysal usullaryň we usullaryň ulanylyşyny görkezýär 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));
Ecutionerine ýetiriş netijeleri:
3
0: abc
1: abc
2: bc
3: c
Java-da yzygiderli aňlatmalar, 4-nji bölüm

Gabat gelýän ýerleri kesgitlemegiň usullary

Synp Matcheroýnuň başlangyç we ahyrky ýagdaýlaryny yzyna gaýtaryp berýän birnäçe usuly hödürleýär:
  • Usul, int start()öňki tapylan oýnuň başlangyç ýagdaýyny görkezýär. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul int start(int group)öňki usula meňzeýär, ýöne nomeri parametr bilen kesgitlenen topar üçin tapylan öňki oýnuň başlangyç ýagdaýyny görkezýär group. Şablonda berlen san bilen tutulan topar ýok bolsa, usul kadadan çykma döredýär IndexOutOfBoundsException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul int start(String name)öňki usula meňzeýär, ýöne çagyrylan topar üçin tapylan öňki oýnuň başlangyç ýagdaýyny görkezýär name. Alnan topar nameşablonda bolmasa, kadadan çykma atylýar IllegalArgumentException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul, int end()öňki tapylan 1-nji oýnuň soňky gahrymanynyň ýagdaýyny görkezýär. Eger-de gabat gelýän oýun oýnamadyk bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul int end(int group)öňki usula meňzeýär, ýöne parametr bilen görkezilen topar üçin tapylan öňki oýnuň ahyrky ýagdaýyny görkezýär group. Şablonda berlen san bilen tutulan topar ýok bolsa, usul kadadan çykma döredýär IndexOutOfBoundsException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

  • Usul int end(String name)öňki usula meňzeýär, ýöne çagyrylan topar üçin tapylan öňki oýnuň ahyrky ýagdaýyny görkezýär name. Alnan topar nameşablonda bolmasa, kadadan çykma atylýar IllegalArgumentException. Eger çözüji entek gözleg geçirmedik bolsa ýa-da öňki gözleg işi başa barmasa, kadadan çykma bolýar IllegalStateException.

Aşakdaky mysal, 2-nji topara düşmek üçin başlangyç / ahyrky oýun pozisiýalaryny çykarýan iki gabat gelýän ýerleşiş usulyny görkezýär:
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();
}
Bu mysalyň netijesi aşakdakylar:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

“PatternSyntaxException” synpynyň usullary

Synpyň mysaly PatternSyntaxExceptionadaty aňlatmada sintaksis ýalňyşlygyny suratlandyrýar. Usullardan compile()we matches()synpdan şeýle kadadan çykma çykarýar Patternwe aşakdaky konstruktoryň üsti bilen emele gelýär: PatternSyntaxException(String desc, String regex, int index) Bu konstruktor görkezilen beýany ( desc), yzygiderli aňlatmany ( regex) we sintaksis ýalňyşlygynyň ýüze çykan ýerini saklaýar. Sintaksis ýalňyşlygynyň ýerleşýän ýeri näbelli bolsa, bahasy indexkesgitlenýär -1. Mümkin, size hiç wagt mysal döretmeli bolmaz PatternSyntaxException. Şeýle-de bolsa, formatlanan säwlik habary döredilende ýokardaky bahalary çykarmaly bolarsyňyz. Munuň üçin aşakdaky usullary ulanyp bilersiňiz:
  • Usul String getDescription()sintaksis ýalňyşlygynyň beýanyny berýär.
  • Usul int getIndex()ýa-da ýalňyşlygyň ýüze çykan ýerini ýa-da ýagdaýy näbelli bolsa -1 görkezýär.
  • Usul String getPattern()nädogry yzygiderli aňlatmany görkezýär.
Mundan başga-da, miras galan usul, String getMessage()şablonda sintaksis ýalňyşlygynyň nirede ýüze çykandygyny wizual görkezmek bilen öňki usullardan gaýtarylan bahalar bilen köp setirli setiri gaýtaryp berýär. Sintaksis säwligi näme? Ine bir mysal: Bu ýagdaýda, baýdak aňlatmasynda java RegexDemo (?itree Treehouse ýapylýan gabygyň metacharacter () -ni görkezmegi ýatdan çykardyk . )Bu ýalňyşlygyň netijesi:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API ulanyp, peýdaly yzygiderli aňlatma programmalaryny guruň

Yzygiderli aňlatmalar güýçli tekst işleýiş programmalaryny döretmäge mümkinçilik berýär. Bu bölümde size Regex API synplaryny we usullaryny has giňişleýin öwrenmäge höweslendirer diýip umyt edýän iki sany amatly programmany görkezeris. Ikinji goşundy Lexan bilen tanyşdyrýar: leksiki derňew geçirmek üçin gaýtadan ulanylýan kod kitaphanasy. Java-da yzygiderli aňlatmalar, 4-nji bölüm

Yzygiderli aňlatmalar we resminamalar

Professional programma üpjünçiligi işlenip düzülende resminamalaşdyrmak hökmany meseleleriň biridir. Bagtymyza, yzygiderli aňlatmalar resminamalary döretmegiň köp tarapy bilen kömek edip biler. 1-nji sanawdaky kod, bir faýldan bir setirli we köp setirli C görnüşli düşündirişleri öz içine alýan setirleri çykarýar we başga bir faýla ýazýar. Kodyň işlemegi üçin teswirler bir setirde bolmaly. Sanaw 1. Teswirleri almak
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” usuly main()ilki bilen buýruk setiriniň sintaksisini barlaýar we soňra bir we köp setirli teswirleri synp obýektine kesgitlemek üçin döredilen yzygiderli aňlatmany düzýär Pattern. Hiç hili kadadan çykma ýok bolsa PatternSyntaxException, usul main()çeşme faýlyny açýar, maksatly faýly döredýär, nagyş bilen okalýan her setire gabat gelýän matç alýar we soňra çeşme faýl setirini setir boýunça okaýar. Her setir üçin düşündiriş nagşy bilen gabat gelýär. Üstünlikli bolsa, usul main()setiri (soňra täze setir bilen) nyşan faýlyna ýazýar (geljekde Java 101 okuw gollanmasynda I / O logika faýlyny ýaparys). 1-nji sanawy düzüň: javac ExtCmnt.java Programmany ExtCmnt.javagiriş hökmünde faýl bilen işlediň: java ExtCmnt ExtCmnt.java out Aşakdaky netijeleri faýlda almaly:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Nusga setirinde .*/\\*.*\\*/|.*//.*$, turba metacharacter |logiki OR ýa-da operator hökmünde çykyş edýär, bu matçeriň gabat gelýän tekstde gabat gelmek üçin berlen yzygiderli aňlatma gurluşynyň çep operanyny ulanmalydygyny görkezýär. Gabat gelmeýän bolsa, gözlegçi başga bir gözleg synanyşygy üçin berlen yzygiderli aňlatma konstruksiýasyndan dogry operand ulanýar (tutulan topardaky gabygyň metacharacterleri hem logiki operator döredýär). Java-da yzygiderli aňlatmalar, 5-nji bölüm
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION