JavaRush /Java Blogu /Random-AZ /Java-da müntəzəm ifadələr, 1-ci hissə

Java-da müntəzəm ifadələr, 1-ci hissə

Qrupda dərc edilmişdir
JavaWorld vebsaytı üçün Jeff Friesen tərəfindən yazılmış Java dilində müntəzəm ifadələrə dair qısa bələdçinin tərcüməsini diqqətinizə çatdırırıq . Oxumaq asanlığı üçün məqaləni bir neçə hissəyə ayırdıq. Java-da müntəzəm ifadələr, 1-ci hissə

Nümunələri tanımaq və təsvir etmək üçün Java Proqramlarında Daimi İfadə API-dən istifadə

Java-nın xarakteri və müxtəlif simli məlumat növləri nümunə uyğunluğu üçün aşağı səviyyəli dəstək təmin edir, lakin bu məqsəd üçün onlardan istifadə adətən əhəmiyyətli kod mürəkkəbliyi əlavə edir. Regex API ("Regular Expression API") istifadə edərək daha sadə və daha effektiv kod əldə edilir. Bu dərslik sizə müntəzəm ifadələr və Regex API ilə başlamağa kömək edəcək. Əvvəlcə paketdəki ən maraqlı üç sinfi müzakirə edəcəyik java.util.regex, sonra sinfin içərisinə nəzər salıb Patternonun mürəkkəb naxışa uyğun konstruksiyalarını araşdıracağıq. Diqqət: Siz bu məqalədən demo proqramın mənbə kodunu (JavaWorld saytı üçün Jeff Friesen tərəfindən yaradılmışdır) buradan yükləyə bilərsiniz .

Normal ifadələr hansılardır?

Normal ifadə (müntəzəm ifadə/regex/regexp) müəyyən sətirlər dəstini təsvir edən nümunə olan sətirdir. Nümunə hansı sıraların çoxluğa aid olduğunu müəyyənləşdirir. Nümunə hərfi və metaxarakterlərdən - hərfi mənadan daha çox xüsusi məna daşıyan simvollardan ibarətdir. Nümunə uyğunluğu uyğunluqları, yəni müntəzəm ifadə nümunəsinə uyğun gələn sətirləri tapmaq üçün mətn axtarışıdır. Java, Regex API vasitəsilə nümunə uyğunluğunu dəstəkləyir. Bu API üç sinifdən ibarətdir: Pattern, MatcherPatternSyntaxException, paketdə yerləşir java.util.regex:
  • sinif obyektləri Pattern, həmçinin şablon adlanır, müntəzəm ifadələr tərtib edilir.
  • sinif obyektləri Matchervə ya uyğunlaşdırıcılar simvol ardıcıllığında uyğunluq tapmaq üçün nümunənin şərh mexanizmləridir (sinifləri interfeys həyata keçirən java.lang.CharSequencevə mətn mənbəyi kimi xidmət edən obyektlər).
  • Sinif obyektləri PatternSyntaxExceptionetibarsız müntəzəm ifadə nümunələrini təsvir etmək üçün istifadə olunur.
Java həmçinin java.lang.String. Məsələn, funksiya yalnız çağıran sətir normal ifadəyə tam uyğun gələrsə boolean matches (String regex)qaytarır . trueregex
Rahat üsullar
matches()və sinfin digər müntəzəm ifadə yönümlü rahatlıq üsulları StringRegex API-yə bənzər şəkildə başlıq altında həyata keçirilir.

RegexDemo

Java müntəzəm ifadələrini və , və RegexDemomüxtəlif üsullarını nümayiş etdirmək üçün proqram yaratdım . Aşağıda bu demo proqram üçün mənbə kodu verilmişdir. Siyahı 1. Müntəzəm ifadə nümayişi PatternMatcherPatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
mainSinif metodunun etdiyi ilk şey RegexDemoonun əmr xəttini yoxlamaqdır. Bunun üçün iki arqument tələb olunur: birincisi müntəzəm ifadə, ikincisi isə nizamlı ifadənin axtarılacağı giriş mətnidir. Siz daxil edilmiş mətn daxilində yeni sətir simvolundan istifadə etməli ola bilərsiniz (\n). \Bu, yalnız simvoldan sonra simvol göstərilməklə edilə bilər n. Funksiya main()bu simvol ardıcıllığını Unicode dəyəri 10-a çevirir. Java-da müntəzəm ifadələr, 1-2-ci hissəKodun əsas RegexDemohissəsi try-catch. Blok əvvəlcə verilmiş müntəzəm ifadəni və daxil edilmiş mətni çıxarır, sonra isə tərtib edilmiş müntəzəm ifadəni saxlayan tryobyekt yaradır (naxış uyğunluğu performansını yaxşılaşdırmaq üçün adi ifadələr tərtib edilir). PatternObyektdən uyğunlaşdırıcı çıxarılır Patternvə hamısı tapılana qədər iterativ olaraq uyğunluqları axtarmaq üçün istifadə olunur. Blok istisna haqqında faydalı məlumat əldə etmək üçün catchbir neçə sinif metodunu çağırır . PatternSyntaxExceptionBu məlumat ardıcıl olaraq çıxış axınına verilir. Hələlik kodun necə işlədiyinin təfərrüatlarını bilməyə ehtiyac yoxdur: bunlar məqalənin ikinci hissəsində API-ni öyrəndikdə aydınlaşacaq. Bununla belə, siz Siyahı 1-i tərtib etməlisiniz. Siyahı 1-dən kodu götürün və sonra tərtib etmək üçün əmr sorğusuna aşağıdakı əmri yazın RegexDemo: javac RegexDemo.java

Pattern sinfi və onun konstruksiyaları

Regex API-ni təşkil edən üç sinifdən birincisi olan sinif Patternmüntəzəm ifadənin tərtib edilmiş təsviridir. Sinif SDK sənədləri Patternmüxtəlif müntəzəm ifadə konstruksiyalarını təsvir edir, lakin siz müntəzəm ifadələrdən aktiv şəkildə istifadə etmirsinizsə, bu sənədlərin hissələri çaşdırıcı ola bilər. Kəmiyyət göstəriciləri nədir və acgöz, istəksiz və sahib kəmiyyət göstəriciləri arasındakı fərq nədir? Xarakter sinifləri, sərhəd uyğunlaşdırıcıları, arxa istinadlar və daxil edilmiş bayraq ifadələri nədir? Bu və digər suallara növbəti bölmələrdə cavab verəcəyəm.

Hərfi sətirlər

Ən sadə müntəzəm ifadə quruluşu hərfi sətirdir. Nümunə uyğunluğunun uğurlu olması üçün daxil edilən mətnin bəzi hissəsi həmin konstruktun nümunəsinə uyğun olmalıdır. Aşağıdakı nümunəyə nəzər salın: Bu misalda biz daxil edilmiş mətndə java RegexDemo apple applet nümunə üçün uyğunluq tapmağa çalışırıq . Aşağıdakı nəticə tapılan uyğunluğu göstərir: appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Çıxışda müntəzəm ifadəni və giriş mətnini, sonra isə appleappletdə uğurlu aşkarlamanın göstəricisini görürük. Bundan əlavə, bu matçın başlanğıc və bitmə mövqeləri verilmişdir: 04müvafiq olaraq. Başlanğıc mövqeyi mətndə uyğunluğun tapıldığı ilk yeri, son mövqe isə matçın son nöqtəsini göstərir. İndi deyək ki, biz aşağıdakı əmr xəttini verdik: java RegexDemo apple crabapple Bu dəfə fərqli başlanğıc və bitmə mövqeləri ilə aşağıdakı nəticəni alırıq:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Əks halda, appletmüntəzəm ifadə ilə apple- daxil edilən mətnlə heç bir uyğunluq tapılmayacaq. tBütün normal ifadə uyğun olmalıdır, lakin bu halda, daxil olan mətndə -dən sonra ifadə yoxdur apple. Java-da müntəzəm ifadələr, 1-3-cü hissə

Meta personajlar

Daha maraqlı müntəzəm ifadə konstruksiyaları hərfi simvolları metasimvollarla birləşdirir. Məsələn, müntəzəm ifadədə a.bnöqtə metaxarakteri və b (.)arasındakı hər hansı simvol deməkdir a. Aşağıdakı nümunəyə nəzər salın: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." Bu nümunə .oxhəm müntəzəm ifadə, həm də The quick brown fox jumps over the lazy ox.daxiletmə mətni kimi istifadə edir. RegexDemomətndə hər hansı simvolla başlayan və ilə bitən uyğunluqları axtarır ox.Onun icrasının nəticələri aşağıdakı kimidir:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Çıxışda iki uyğunluq görürük: foxox(qarşısında boşluq simvolu ilə). Metaxarakter birinci halda . xarakterə, ikinci halda isə boşluğa uyğun gəlir . Onu metaxarakterlə fəvəz etsəniz nə olar ? Yəni, aşağıdakı əmr xətti nəticəsində əldə etdiyimiz şey: Nöqtə metaxarakteri istənilən simvola uyğun gəldiyi üçün daxil edilmiş mətnin bütün simvolları (arxadakı nöqtə simvolu daxil olmaqla) üçün tapılan uyğunluqları çıxaracaq: .ox.java RegexDemo . "The quick brown fox jumps over the lazy ox."RegexDemo
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Sitat meta simvolları
Normal ifadə konstruksiyasında hərfi simvol kimi və ya hər hansı digər metaxarakteri təyin etmək üçün .aşağıdakı yollardan biri ilə ondan qaçmalısınız:
  • əks kəsik işarəsi ilə ondan əvvəl;
  • Bu metaxarakteri \Qvə arasında yerləşdirin \E(məsələn, \Q.\E).
Sətir literalında görünən hər hansı simvolları, məsələn, String regex = "\\.";əks xətlər (məsələn, \\.və ya \\Q.\\E) təkrarlamağı unutmayın. Komanda xətti arqumentinin bir hissəsi olan əks kəsikləri təkrarlamayın.

Xarakter sinifləri

Bəzən axtardığınız uyğunluğu müəyyən bir simvol dəsti ilə məhdudlaşdırmalı olursunuz. Məsələn, mətndə a, e, ivə saitləri axtarın o, usait hərfinin hər dəfə rast gəlinməsi uyğunluq sayılır. Bu cür problemlərin həllində bizə kvadrat mötərizələrin ( ) metasimvolları arasında simvol dəstlərini təyin edən simvol sinifləri kömək edəcəkdir [ ]. Sinif Patternsadə simvol siniflərini, diapazon siniflərini, tərs, birləşmə, kəsişmə və çıxma siniflərini dəstəkləyir. İndi onların hamısına baxacağıq.

Sadə xarakter sinifləri

Sadə simvol sinfi yan-yana yerləşdirilmiş simvollardan ibarətdir və yalnız həmin simvollara uyğun gəlir. Məsələn, sinif [abc]simvollara uyğun gəlir ab. cAşağıdakı misalı nəzərdən keçirin: java RegexDemo [csw] cave Nəticələrdən göründüyü kimi, bu nümunədə yalnız cuyğunluğu olan simvol cave:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

Ters çevrilmiş xarakter sinifləri

Ters çevrilmiş simvol sinfi metaxarakterlə başlayır ^və yalnız onun tərkibində olmayan simvollara uyğun gəlir. Məsələn, sinif, və istisna olmaqla , [^abc]bütün simvollara uyğun gəlir . Aşağıdakı nümunəyə nəzər salın: Qeyd edək ki, mənim əməliyyat sistemimdə (Windows) ikiqat dırnaq işarələri tələb olunur, çünki qabıq onları qaçış simvolu kimi qəbul edir. Gördüyünüz kimi, bu nümunədə yalnız və simvolları tapıldı , bunlar üçün uyğunluqlar var : abcjava RegexDemo "[^csw]" cave^avecave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

Diapazon xarakter sinifləri

Aralıq simvol sinfi defis ( -) ilə ayrılmış iki simvoldan ibarətdir. Tirenin solundakı simvoldan başlayaraq sağdakı simvolla bitən bütün simvollar diapazonun bir hissəsidir. Məsələn, diapazon [a-z]bütün kiçik Latın hərflərinə uyğun gəlir. Bu, sadə bir sinfi təyin etməyə bərabərdir [abcdefghijklmnopqrstuvwxyz]. Aşağıdakı nümunəyə nəzər salın: Bu nümunə yalnız uyğunluğu olan java RegexDemo [a-c] clown xarakterə uyğun olacaq : cclown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java-da müntəzəm ifadələr, 2-ci hissə Java-da müntəzəm ifadələr, 3-cü hissə Java-da müntəzəm ifadələr, 4-cü hissə Java-da müntəzəm ifadələr, 5-ci hissə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION