Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Регулярные выражения
Методы Класса Образца
Домашняя страница > Существенные Классы > Регулярные выражения

Методы Класса Образца

До сих пор мы только использовали тестовый ремень безопасности, чтобы создать Pattern объекты в их наиболее канонической форме. Этот раздел исследует усовершенствованные методы, такие как создание образцов с флагами и использованием встроенных выражений флага. Это также исследует некоторые дополнительные полезные методы, которые мы еще не обсудили.

Создание Образца с Флагами

Pattern class определяет альтернативу compile метод, который принимает ряд флагов, влияющих на путь образец, является соответствующим. Параметр флагов является небольшим количеством маски, которая может включать любое из следующих общедоступных статических полей:

В следующих шагах мы изменим тестовый ремень безопасности, RegexTestHarness.java создать образец с нечувствительным к регистру соответствием.

Во-первых, измените код, чтобы вызвать вариант compile:

Pattern pattern = 
Pattern.compile(console.readLine("%nEnter your regex: "),
Pattern.CASE_INSENSITIVE);

Затем скомпилируйте и выполните тестовый ремень безопасности, чтобы получить следующие результаты:

 
Enter your regex: dog
Enter input string to search: DoGDOg
I found the text "DoG" starting at index 0 and ending at index 3.
I found the text "DOg" starting at index 3 and ending at index 6.

Как можно видеть, строковый литерал "собака" соответствует оба происшествия, независимо от случая. Чтобы скомпилировать образец с многократными флагами, разделите флаги, которые будут включены, используя оператор битового "ИЛИ""|". Для ясности, следующие примеры кода hardcode регулярное выражение вместо того, чтобы читать это из Console:

 
pattern = Pattern.compile("[az]$", Pattern.MULTILINE | Pattern.UNIX_LINES);

Вы могли также определить int переменная вместо этого:

 
final int flags = Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
Pattern pattern = Pattern.compile("aa", flags);

Встроенные Выражения Флага

Также возможно включить различным флагам, используя встроенные выражения флага. Встроенные выражения флага являются альтернативой версии с двумя параметрами compile, и определяются в регулярном выражении непосредственно. Следующий пример использует исходный тестовый ремень безопасности, RegexTestHarness.java со встроенным выражением флага (?i) включать нечувствительному к регистру соответствию.

 
Enter your regex: (?i)foo
Enter input string to search: FOOfooFoOfoO
I found the text "FOO" starting at index 0 and ending at index 3.
I found the text "foo" starting at index 3 and ending at index 6.
I found the text "FoO" starting at index 6 and ending at index 9.
I found the text "foO" starting at index 9 and ending at index 12.

Еще раз все соответствия успешно выполняются независимо от случая.

Встроенные выражения флага, которые соответствуют Pattern's публично доступные поля представляются в следующей таблице:

Постоянный Эквивалентное Встроенное Выражение Флага
Pattern.CANON_EQ Ни один
Pattern.CASE_INSENSITIVE (?i)
Pattern.COMMENTS (?x)
Pattern.MULTILINE (?m)
Pattern.DOTALL (?s)
Pattern.LITERAL Ни один
Pattern.UNICODE_CASE (?u)
Pattern.UNIX_LINES (?d)

Используя matches(String,CharSequence) Метод

Pattern class определяет удобное matches метод, который позволяет Вам быстро проверять, присутствует ли образец в данной строке ввода. Как со всеми общедоступными статическими методами, следует вызвать matches его именем class, такой как Pattern.matches("\\d","1");. В этом примере, возвратах метода true, потому что цифра "1" соответствует регулярное выражение \d.

Используя split(String) Метод

split метод является большим инструментом для того, чтобы собрать текст, который находится по обе стороны от образца, который это было соответствующим. Как показано ниже в SplitDemo.java, split метод мог извлечь слова"one two three four five"от строки"one:two:three:four:five":


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

public class SplitDemo {

    private static final String REGEX = ":";
    private static final String INPUT =
        "one:two:three:four:five";
    
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        String[] items = p.split(INPUT);
        for(String s : items) {
            System.out.println(s);
        }
    }
}
OUTPUT:

one
two
three
four
five

Для простоты мы соответствовали строковый литерал, двоеточие (:) вместо сложного регулярного выражения. Так как мы все еще используем Pattern и Matcher объекты, можно использовать разделение, чтобы получить текст, который падает по обе стороны от любого регулярного выражения. Вот тот же самый пример, SplitDemo2.java, измененный, чтобы разделить на цифрах вместо этого:


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

public class SplitDemo2 {

    private static final String REGEX = "\\d";
    private static final String INPUT =
        "one9two4three7four1five";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        String[] items = p.split(INPUT);
        for(String s : items) {
            System.out.println(s);
        }
    }
}
OUTPUT:

one
two
three
four
five

Другие Служебные Методы

Можно найти, что следующие методы несколько полезны также:

Эквиваленты Метода образца в java.lang.String

Поддержка регулярного выражения также существует в java.lang.String через несколько методов, которые подражают поведению java.util.regex.Pattern. Для удобства ключевые выборки от их API представляются ниже.

Есть также метод замены, который заменяет тот CharSequence с другим:


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Граничный Matchers
Следующая страница: Методы Класса Matcher