Java - Normal İfadeler

Java, normal ifadelerle kalıp eşleşmesi için java.util.regex paketini sağlar. Java normal ifadeleri Perl programlama diline çok benzer ve öğrenmesi çok kolaydır.

Normal ifade, bir modelde tutulan özel bir sözdizimini kullanarak diğer dizeleri veya dize kümelerini eşleştirmenize veya bulmanıza yardımcı olan özel bir karakter dizisidir. Metin ve verileri aramak, düzenlemek veya değiştirmek için kullanılabilirler.

Java.util.regex paketi öncelikle aşağıdaki üç sınıftan oluşur -

  • Pattern Class- Bir Desen nesnesi, bir normal ifadenin derlenmiş bir temsilidir. Pattern sınıfı hiçbir genel yapıcı sağlamaz. Bir model oluşturmak için önce genel statiklerinden birini çağırmalısınız.compile()yöntemler, daha sonra bir Pattern nesnesi döndürür. Bu yöntemler, ilk argüman olarak bir normal ifadeyi kabul eder.

  • Matcher Class- Bir Matcher nesnesi, modeli yorumlayan ve bir giriş dizesine karşı eşleştirme işlemleri gerçekleştiren motordur. Pattern sınıfı gibi, Matcher hiçbir genel kurucu tanımlamaz. Bir Matcher nesnesi elde edersiniz.matcher() Bir Pattern nesnesinde yöntem.

  • PatternSyntaxException - Bir PatternSyntaxException nesnesi, normal ifade modelinde bir sözdizimi hatasını gösteren denetlenmemiş bir istisnadır.

Grupları Yakalama

Grupları yakalama, birden çok karakteri tek bir birim olarak ele almanın bir yoludur. Gruplanacak karakterlerin bir parantez seti içine yerleştirilmesiyle oluşturulurlar. Örneğin, normal ifade (köpek) "d", "o" ve "g" harflerini içeren tek bir grup oluşturur.

Yakalama grupları, soldan sağa açılış parantezleri sayılarak numaralandırılır. Örneğin ((A) (B (C))) ifadesinde, bu tür dört grup vardır -

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

İfadede kaç grup olduğunu öğrenmek için, bir eşleştirme nesnesinde groupCount yöntemini çağırın. GroupCount yöntemi birint eşleştiricinin deseninde bulunan yakalama gruplarının sayısını gösterir.

Ayrıca her zaman tüm ifadeyi temsil eden özel bir grup 0 vardır. Bu grup, groupCount tarafından bildirilen toplama dahil değildir.

Example

Aşağıdaki örnek, verilen alfanümerik dizeden bir rakam dizesinin nasıl bulunacağını gösterir -

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

Bu, aşağıdaki sonucu verecektir -

Output

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

Normal İfade Söz Dizimi

Java'da bulunan tüm normal ifade meta karakter sözdizimini listeleyen tablo şu şekildedir:

Alt ifade Maçlar
^ Satırın başıyla eşleşir.
$ Satırın sonuyla eşleşir.
. Yeni satır hariç herhangi bir tek karakterle eşleşir. Kullanmam seçeneği, yeni satırla eşleşmesine de izin verir.
[...] Parantez içindeki herhangi bir tek karakterle eşleşir.
[^ ...] Parantez içinde olmayan herhangi bir karakterle eşleşir.
\ A Tüm dizenin başlangıcı.
\ z Tüm dizenin sonu.
\ Z İzin verilen son satır sonlandırıcı dışında tüm dizenin sonu.
yeniden* Önceki ifadenin 0 veya daha fazla oluşumuyla eşleşir.
yeniden + Önceki şeyden 1 veya daha fazlasıyla eşleşir.
yeniden? Önceki ifadenin 0 veya 1 oluşumuyla eşleşir.
yeniden {n} Önceki ifadenin tam olarak n sayıda oluşumuyla eşleşir.
re {n,} Önceki ifadenin n veya daha fazla oluşumuyla eşleşir.
re {n, m} Önceki ifadenin en az n ve en çok m oluşumuyla eşleşir.
a | b A veya b ile eşleşir.
(yeniden) Normal ifadeleri gruplandırır ve eşleşen metni hatırlar.
(?: yeniden) Normal ifadeleri eşleşen metni hatırlamadan gruplar.
(?> yeniden) Geriye dönmeden bağımsız modelle eşleşir.
\ w Kelime karakterleriyle eşleşir.
\ W Sözcük olmayan karakterlerle eşleşir.
\ s Beyaz boşlukla eşleşir. [\ T \ n \ r \ f] ile eşdeğerdir.
\ S Beyaz olmayan boşlukla eşleşir.
\ d Rakamlarla eşleşir. [0-9] ile eşdeğerdir.
\ D Sayı olmayanlarla eşleşir.
\ A Dizenin başlangıcıyla eşleşir.
\ Z Dizenin sonuyla eşleşir. Bir satırsonu varsa, yeni satırdan hemen önce eşleşir.
\ z Dizenin sonuyla eşleşir.
\ G Son maçın bittiği noktayla eşleşir.
\ n Grup numarası "n" için geriye dönük referans.
\ b Köşeli parantezlerin dışındayken kelime sınırlarıyla eşleşir. Köşeli parantezlerin içindeyken geri boşlukla (0x08) eşleşir.
\ B Sözcük olmayan sınırlarla eşleşir.
\ n, \ t vb. Yeni satırlarla, satır başlarıyla, sekmelerle vb. Eşleşir.
\ Q \ E'ye kadar tüm karakterlerden kaçın (tırnak işareti).
\ E \ Q ile başlayan alıntı biter.

Matcher Sınıfının Yöntemleri

İşte kullanışlı örnek yöntemlerinin bir listesi -

Dizin Yöntemleri

Dizin yöntemleri, eşleşmenin giriş dizesinde tam olarak nerede bulunduğunu gösteren yararlı dizin değerleri sağlar -

Sr.No. Yöntem ve Açıklama
1

public int start()

Önceki eşleşmenin başlangıç ​​dizinini döndürür.

2

public int start(int group)

Önceki eşleme işlemi sırasında belirli grup tarafından yakalanan alt dizinin başlangıç ​​dizinini döndürür.

3

public int end()

Eşleşen son karakterden sonraki uzaklığı döndürür.

4

public int end(int group)

Önceki maç işlemi sırasında verilen grup tarafından yakalanan alt dizinin son karakterinden sonraki ofseti döndürür.

Çalışma Yöntemleri

Çalışma yöntemleri giriş dizesini gözden geçirir ve kalıbın bulunup bulunmadığını belirten bir Boole döndürür -

Sr.No. Yöntem ve Açıklama
1

public boolean lookingAt()

Girdi sırasını, bölgenin başlangıcından başlayarak modelle eşleştirmeye çalışır.

2

public boolean find()

Desenle eşleşen giriş dizisinin bir sonraki alt dizisini bulmaya çalışır.

3

public boolean find(int start)

Bu eşleştiriciyi sıfırlar ve ardından, belirtilen dizinden başlayarak modelle eşleşen giriş dizisinin bir sonraki alt dizisini bulmaya çalışır.

4

public boolean matches()

Kalıpla tüm bölgeyi eşleştirmeye çalışır.

Değiştirme Yöntemleri

Değiştirme yöntemleri, bir girdi dizesindeki metni değiştirmek için kullanışlı yöntemlerdir -

Sr.No. Yöntem ve Açıklama
1

public Matcher appendReplacement(StringBuffer sb, String replacement)

Terminal olmayan bir ekleme ve değiştirme adımı uygular.

2

public StringBuffer appendTail(StringBuffer sb)

Bir uçbirim ekleme ve değiştirme adımını uygular.

3

public String replaceAll(String replacement)

Girdi dizisinin, modelle eşleşen her alt dizisini verilen değiştirme dizesiyle değiştirir.

4

public String replaceFirst(String replacement)

Desenle eşleşen giriş dizisinin ilk alt dizisini verilen değiştirme dizesiyle değiştirir.

5

public static String quoteReplacement(String s)

Belirtilen String için değişmez bir değiştirme String döndürür. Bu yöntem, değişmez bir değiştirme olarak çalışacak bir Dize üretirs Matcher sınıfının appendReplacement yönteminde.

Başlangıç ​​ve bitiş Yöntemleri

Giriş dizesinde "kedi" kelimesinin kaç kez göründüğünü sayan örnek aşağıdadır -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "\\bcat\\b";
   private static final String INPUT = "cat cat cat cattie cat";

   public static void main( String args[] ) {
      Pattern p = Pattern.compile(REGEX);
      Matcher m = p.matcher(INPUT);   // get a matcher object
      int count = 0;

      while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

Bu, aşağıdaki sonucu verecektir -

Output

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Bu örneğin, "c" "a" "t" harflerinin yalnızca uzun bir kelimenin alt dizesi olmamasını sağlamak için kelime sınırları kullandığını görebilirsiniz. Ayrıca, eşleşmenin giriş dizesinde nerede meydana geldiğine dair bazı yararlı bilgiler verir.

Başlangıç ​​yöntemi, önceki eşleme işlemi sırasında verilen grup tarafından yakalanan alt dizinin başlangıç ​​dizinini döndürür ve son, eşleşen son karakterin dizinini artı bir döndürür.

Eşleşmeler ve Görünüm Yöntemleri

Match ve lookingAt yöntemlerinin her ikisi de bir giriş sırasını bir modelle eşleştirmeye çalışır. Ancak aradaki fark, eşleşmelerin tüm giriş sırasının eşleştirilmesini gerektirmesi, ancak lookingAt'ın bunu yapmamasıdır.

Her iki yöntem de her zaman giriş dizesinin başlangıcında başlar. İşte işlevselliği açıklayan örnek -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "foo";
   private static final String INPUT = "fooooooooooooooooo";
   private static Pattern pattern;
   private static Matcher matcher;

   public static void main( String args[] ) {
      pattern = Pattern.compile(REGEX);
      matcher = pattern.matcher(INPUT);

      System.out.println("Current REGEX is: "+REGEX);
      System.out.println("Current INPUT is: "+INPUT);

      System.out.println("lookingAt(): "+matcher.lookingAt());
      System.out.println("matches(): "+matcher.matches());
   }
}

Bu, aşağıdaki sonucu verecektir -

Output

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

ReplaceFirst ve replaceAll Yöntemleri

ReplaceFirst ve replaceAll yöntemleri, belirli bir normal ifadeyle eşleşen metni değiştirir. Adlarından da anlaşılacağı gibi, replaceFirst ilk geçtiği yerin yerine geçer ve replaceAll tüm yinelemelerin yerini alır.

İşte işlevselliği açıklayan örnek -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "dog";
   private static String INPUT = "The dog says meow. " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT); 
      INPUT = m.replaceAll(REPLACE);
      System.out.println(INPUT);
   }
}

Bu, aşağıdaki sonucu verecektir -

Output

The cat says meow. All cats say meow.

AppendReplacement ve appendTail Yöntemleri

Matcher sınıfı, metin değişimi için appendReplacement ve appendTail yöntemlerini de sağlar.

İşte işlevselliği açıklayan örnek -

Example

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()) {
         m.appendReplacement(sb, REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Bu, aşağıdaki sonucu verecektir -

Output

-foo-foo-foo-

PatternSyntaxException Sınıf Yöntemleri

PatternSyntaxException, normal ifade deseninde sözdizimi hatasını gösteren denetlenmemiş bir istisnadır. PatternSyntaxException sınıfı, neyin yanlış gittiğini belirlemenize yardımcı olacak aşağıdaki yöntemleri sağlar -

Sr.No. Yöntem ve Açıklama
1

public String getDescription()

Hatanın açıklamasını alır.

2

public int getIndex()

Hata indeksini alır.

3

public String getPattern()

Hatalı normal ifade modelini alır.

4

public String getMessage()

Sözdizimi hatasının açıklamasını ve dizini, hatalı normal ifade modelini ve kalıp içindeki hata dizininin görsel bir göstergesini içeren çok satırlı bir dize döndürür.