Comparadores de límites Regex en Java

Requisito previo: expresiones regulares en Java

Las coincidencias de límites pueden ayudarnos a encontrar en qué parte de la string se está produciendo la coincidencia. Puede hacer que sus coincidencias de patrones sean más precisas especificando dicha información con los emparejadores de límites. Por ejemplo, tal vez le interese encontrar una palabra en particular, pero solo si aparece al principio o al final de una línea. O tal vez quiera saber si la coincidencia se lleva a cabo en un límite de palabras o al final de la coincidencia anterior.

Lista de emparejadores de límites

  • ^  –  Colocado antes de la palabra para coincidir
  • $–  Colocado al final de una palabra para que coincida
  • \b  –  Comprueba si un patrón comienza o termina en un límite de palabra
  • \B coincide con la expresión en un límite que no es una palabra
  • \A El comienzo de la entrada
  • \G Requiere que la coincidencia ocurra solo al final de la coincidencia anterior
  • \Z : el final de la entrada pero para el terminador final, si lo hay
  • \z El final de la entrada

Caso 1: Emparejar la palabra con ^ y $

  • ^ – coincide con el comienzo de una línea
  • $ – coincide con el final.
  • Input : txt = "geeksforgeeks", regex = "^geeks"
    Output : Found from index 0 to 3
    Explanation : Note that the result doesn't include "geeks" after
                  "for" as we have used ^ in regex.
  • Input : txt = "geeksforgeeks", regex = "geeks$"
    Output : Found from index 8 to 13.
    Explanation : Note that the result doesn't include "geeks" before 
                 "for" as we have used $ in regex.
  • Input : txt = "geeksforgeeks", regex = "^geeks$"
    Output : No match found
    Explanation : The given regex would only matches with "geeks".
  • Input : txt = "  geeksforgeeks", regex = "^geeks"
    Output: No match found.
    Explanation : The input string contains extra whitespace at the beginning.
  • // Extra \ is used to escape one \
    Input : txt = "  geeksforgeeks", regex : "^\\s+geeks"
    Output: Found from index 0 to 6.
    Explanation : The pattern specifies geeks after one or more spaces.
// Java program to demonstrate that ^ matches the beginning of
// a line, and $ matches the end.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
  
class Reg
{
    public static void main(String[] args)
    {
        String txt = "geeksforgeeks";
  
        // Demonstrating ^
        String regex1 = "^geeks";
        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);
        Matcher matcher1 = pattern1.matcher(txt);
        while (matcher1.find())
        {
            System.out.println("Start index: " + matcher1.start());
            System.out.println("End index: " + matcher1.end());
        }
  
        // Demonstrating $
        String regex2 = "geeks$";
        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE);
        Matcher matcher2 = pattern2.matcher(txt);
        while (matcher2.find())
        {
            System.out.println("\nStart index: " + matcher2.start());
            System.out.println("End index: " + matcher2.end());
        }
    }
}

Producción:

Start index: 0
End index: 5

Start index: 8
End index: 13

Caso 2: verifica si un patrón comienza o termina en un límite de palabra usando \b

  • Input: txt = "geeksforgeeks geekspractice", pat = "\\bgeeks"
    Output: Found from index 0 to 5 and from index 14 to 19
    Explanation : The pattern "geeks" is present at the beginning
                  of two words "geeksforgeeks" and "geekspractice"
    
  • Input: txt = "geeksforgeeks geekspractice", pat = "geeks\\b"
    Output: Found from index 8 to 13
    Explanation : The pattern "geeks" is present at the end of one
                  word "geeksforgeeks"
    
// Java program to demonstrate use of \b to match 
// regex at beginning and end of word boundary 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
  
class Reg 
{ 
    public static void main(String[] args) 
    { 
        String txt = "geeksforgeeks geekspractice"; 
  
        // Demonstrating beginning of word boundary 
        String regex1 = "\\bgeeks"; // Matched at two places 
        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE); 
        Matcher matcher1 = pattern1.matcher(txt); 
        while (matcher1.find()) 
        { 
            System.out.println("Start index: " + matcher1.start()); 
            System.out.println("End index: " + matcher1.end()); 
        } 
  
        // Demonstrating end of word boundary 
        String regex2 = "geeks\\b"; // Matched at one place 
        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE); 
        Matcher matcher2 = pattern2.matcher(txt); 
        while (matcher2.find()) 
        { 
            System.out.println("\nStart index: " + matcher2.start()); 
            System.out.println("End index: " + matcher2.end()); 
        } 
    } 
} 

Producción:

Start index: 0
End index: 5
Start index: 14
End index: 19

Start index: 8
End index: 13

Caso 3: haga coincidir la expresión en un límite que no sea de palabra, use \B en su lugar

  • Input: txt = "geeksforgeeks geekspractice", pat = "\\Bgeeks"
    Output: Found from index 8 to 13
    Explanation : One occurrence  of pattern "geeks" is not present at
                  the beginning of word which is end of "geeksforgeeks"
    
  • Input: txt = "geeksforgeeks geekspractice", pat = "geeks\\B"
    Output: Found from index 0 to 5 and from index 14 to 19
    Explanation : Two occurrences of "geeks" are not present at the end
                  of word.
    
// Java program to demonstrate use of \B to match 
// regex at beginning and end of non word boundary 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
  
class Reg 
{ 
    public static void main(String[] args) 
    { 
        String txt = "geeksforgeeks geekspractice"; 
  
        // Demonstrating Not beginning of word 
        String regex1 = "\\Bgeeks"; // Matches with two 
        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE); 
        Matcher matcher1 = pattern1.matcher(txt); 
        while (matcher1.find()) 
        { 
            System.out.println("Start index: " + matcher1.start()); 
            System.out.println("End index: " + matcher1.end() + "\n"); 
        } 
  
        // Demonstrating Not end of word 
        String regex2 = "geeks\\B"; // Matches with one 
        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE); 
        Matcher matcher2 = pattern2.matcher(txt); 
        while (matcher2.find()) 
        { 
            System.out.println("Start index: " + matcher2.start()); 
            System.out.println("End index: " + matcher2.end()); 
        } 
    } 
} 

Producción:

Start index: 8
End index: 13

Start index: 0
End index: 5
Start index: 14
End index: 19

Caso 4: Coincidencia para ocurrir solo al final de la coincidencia anterior, use \G:

  • Input: txt = "geeksgeeks geeks", pat = "\\Ggeeks"
    Output: Found from index 0 to 5 and from 5 to 10
    Explanation : Only first two occurrences of "geeks" in text
                  match. the occurrence after space doesn't match
                  as it is not just after previous match.
    
// Java program to demonstrate use of \G to match 
// to occur only at the end of the previous match 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
  
class Reg 
{ 
    public static void main(String[] args) 
    { 
        String txt = "geeksgeeks geeks"; 
  
        // Demonstrating \G 
        String regex1 = "\\Ggeeks"; // Matches with first two geeks 
        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE); 
        Matcher matcher1 = pattern1.matcher(txt); 
        while (matcher1.find()) 
        { 
            System.out.println("Start index: " + matcher1.start()); 
            System.out.println("End index: " + matcher1.end()); 
        } 
    } 
} 

Producción:

Start index: 0
End index: 5
Start index: 5
End index: 10

Referencias: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

Este artículo es una contribución de Nishant Sharma . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *