JavaRush /Java блогу /Random-KY /Java тилиндеги кадимки туюнтмалар, 4-бөлүк

Java тилиндеги кадимки туюнтмалар, 4-бөлүк

Группада жарыяланган
Биз сиздердин назарыңыздарга javaworld веб-сайты үчүн Джефф Фризен тарабынан жазылган Java тorндеги туруктуу сөз айкаштары боюнча кыска жолдун котормосун сунуштайбыз . Окууга ыңгайлуу болушу үчүн биз макаланы бир нече бөлүккө бөлдүк. Java тorндеги кадимки туюнтмалар, 4 - 1-бөлүк Java тorндеги кадимки туюнтмалар, 1-бөлүк Java тorндеги кадимки туюнтмалар, 2-бөлүк Java тorндеги кадимки туюнтмалар, 3-бөлүк

Кармалган топтор менен иштөө ыкмалары

Колдонмонун булак codeу RegexDemoыкма чакыруусун камтыйт m.group(). Метод басып алынган топтор менен иштөөгө багытталган group()класстын бир нече ыкмаларынын бири :Matcher
  • Метод int groupCount()чечүүчү үлгүдөгү басып алынган топтордун санын кайтарат. Бул сан бүтүндөй үлгүгө туура келген 0 номерлүү атайын басып алуу тобун эске алbyte.

  • Метод String group()мурунку табылган матчтын символдорун кайтарат. Бош сапты ийгorктүү издөө жөнүндө кабарлоо үчүн, бул ыкма бош сапты кайтарат. Эгерде чечүүчү издөөнү аткара элек болсо же мурунку издөө операциясы ишке ашпай калса, өзгөчө жагдай чыгарылат 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 тorндеги кадимки туюнтмалар, 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 тorндеги кадимки туюнтмалар, 4-3-бөлүк

Кадимки сөз айкаштары жана documentтер

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