Latest web development tutorials

Java регулярные выражения

Регулярное выражение определяет строку шаблона.

Регулярные выражения могут быть использованы для поиска, редактирования или обработки текста.

Регулярные выражения не ограничены определенным языком, но есть тонкие различия в каждом языке.

Java регулярных выражений и Perl является наиболее близким.

java.util.regex пакет включает в себя следующие три категории:

  • Шаблон категории:

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

  • Сличитель категории:

    Сличитель объект является интерпретация входной строки и согласования работы двигателя. Как и класс Pattern, Сличитель не имеет открытый конструктор. Вам нужно вызвать метод Pattern Matcher объект для получения объекта Matcher.

  • PatternSyntaxException:

    PatternSyntaxException не является обязательным класс исключения, который представляет собой регулярные синтаксические ошибки паттерн экспрессии.


группа захвата

Захват группы несколько символов, когда одиночный блок методов лечения, через символы, сгруппированных в скобках, чтобы создать.

Например, регулярное выражение (собака) создает одну группу, группу, которая содержит "D", "о" и "г".

Захват группы путем расчета ее открывающую скобку пронумерованных слева направо. Например, в выражении ((А) (В (С))), существует четыре такие группы:

  • ((А) (В (С)))
  • (А)
  • (В (С))
  • (С)

Называя сличитель объект groupCount способ увидеть, сколько выражение пакетов. Метод groupCount возвращает Int, представляющую объект Сличитель в настоящее время имеет несколько групп захвата.

Существует специальная группа (группа 0), она всегда представляет собой полное выражение. Группа не включается в возвращаемое значение groupCount.

примеров

В следующем примере показано, как найти строку чисел из заданной строки:

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

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      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");
      }
   }
}

Приведенные выше примеры скомпилированные получены следующие результаты:

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

Синтаксис регулярных выражений

характер

объяснение

\

Следующий символ отмечен как специальный символ, текст, обратные ссылки или восьмеричной побега. Например, "п" соответствует символу "N". "\ N" соответствует символу новой строки. Последовательность "\\" соответствует "\", "\ (" Match "(".

^

Матч начинается входной строки. Если установить свойствоRegExp позиции соответствия объекта Multiline, а также ^ "\ п" или "\ г" после.

$

Матч входной конец позиции строки. Если собственностьмногострочного объекта типа RegExp,$ также совпадает с "\ п" или положение "\ г" перед.

*

Ноль или более раз соответствует предыдущий символ или подвыражения. Например, зо * совпадает с "Z" и "зоопарк". * Эквивалент {0,}.

+

Один или несколько раз соответствует предыдущий символ или подвыражения. Например, "зо +" и "зо" и "зоопарк" матч, но "г" не совпадают. + Эквивалентно {1}.

?

Ноль или один из них соответствует предыдущий символ или подвыражения. Например, "делать (а)?" Соответствует "делать" или "делает" в "делать". ? Эквивалент {0,1}.

{N}

пнеотрицательное целое число. Соответствует ровнопраз. Например, "о {2}" и "Боб" в "о" не соответствует, но "пища" из двух "о" матче.

{N}

пнеотрицательное целое число. Матч по крайней мерепраз. Например, "о {2}" не соответствует "Боб" в "о", а также матч "foooood" все о. "О {1}" эквивалентно "о +". "О {0}" эквивалентно "о *".

{N,т}

Ми неотрицательное целое числоп,гдеп<= т. Матч по крайней мере ,п иболеетраз. Например, "о {1,3}" спички "fooooood" в трех первых о. 'O {0,1}' эквивалентно 'о?'. Примечание: Вы не можете вставлять пробелы между запятыми и числами.

?

Когда персонажи следуют в любом другом классификаторе (*, +,?, { N}, {п,}, {п, т}) позже, шаблон согласования является "не жадный" . "Non-жадный" поиска по шаблону для поиска возможной короткой строки, и "жадный" шаблон по умолчанию соответствия для поиска возможной длинной строки. Например, в строке "оооо" в "о +?" Сопоставляется только один "O", и "O +" не соответствует всем "O".

,

Соответствует любому символу, за исключением "\ г \ п" есть. Для соответствия включают "\ г \ п", в том числе любые символы, такие как шаблон использования "[\ s \ S]" или тому подобное.

(Шаблон)

Сопоставление собразцоми захват подвыражением матча. Вы можете использовать свойства$ 0 ... $ 9 соответствуют результаты "согласования" коллекции происходит поиск в плен.Чтобы соответствовать круглые скобки символов (), используйте "\ (" или "\)."

(?:Шаблон)

Сопоставление пошаблону, но не фиксирует подвыражению матч , что это совпадение не-отлов, согласование не сохраняется для последующего использования. Это для использования "или" символ (|), когда компоненты режима комбинации полезной. Например, 'промышл (?: Y | е годы) представляет собой отношение' промышленности | более экономного выражения индустрий.

(?= Шаблон)

Выполнение прямого предсказания подвыражению первая строка поиска поиска пошаблонустроки в начальной точке выражениям. Это матч без захвата, что не захватывает матч для последующего использования. Например, 'Windows (= 95 |? 98 | NT | 2000) "Matching" Windows 2000 "" Windows ", но не соответствует" Windows 3.1 "в" Windows ". Lookahead не принимают характер есть, после того, как происходит матч, следующий матч для поиска сразу после последнего матча, а не после первого прогноза в составе персонажей.

(?!Pattern)

Lookahead подвыражению выполнить обратный поиск, выражение не соответствуетшаблонустроки соответствия в начальной точке строки поиска. Это матч без захвата, что не захватывает матч для последующего использования. Например, 'Windows (95 | 98 ?! | NT | 2000)' соответствует "Windows 3.1" в "Windows", но не соответствует "Windows 2000" "Windows". Lookahead не принимают характер есть, после того, как происходит матч, следующий матч для поиска сразу после последнего матча, а не после первого прогноза в составе персонажей.

х|у

Матчхилиу.Например, 'г | еда' соответствует "Z" или "еда". '(Z | е) ООД "матч" zood "или" пища ".

[Xyz]

Набор символов. Соответствует любому символу включен. Например, "[ABC]" соответствует "простой" в "а".

[^Xyz]

Обратный набор символов. Соответствует любому символу, не включены. Например, "[^ ABC]" соответствует "простой" в "р", "л", "я", "п".

[Az]

Диапазон символов. Соответствует любому символу в пределах указанного диапазона. Например, "[AZ]" соответствует "а" до любых строчных букв в диапазоне "Z".

[^Az]

Обратный диапазон символов. Соответствует любому символу, не находится в пределах указанного диапазона. Например, "[^ AZ]" соответствует любому не "а" на любой из символов в диапазоне "Z".

\ B

Соответствует границе слова, то есть, положение слова и пространства между ними. Например, "эр \ Ъ" не соответствует "никогда" в "эр", но не соответствует "глагол" в "эр".

\ B

Матч граница слова. "Er \ B" соответствует "глагол" в "эр", но не соответствует "никогда" в "эр".

\С х

Контроль соответствия символов обозначаетсях.Например, \ сМ соответствует Control-M или возврат каретки. Величинахдолжна быть в пределах от AZ или AZ. Если нет, то предполагается, что с является "C" символ сам по себе.

\ D

Сопоставление цифровых символов. Эквивалент [0-9].

\ D

Матч не-цифровых символов. Это эквивалентно [^ 0-9].

\ F

Под.стр матч. Эквивалент \ x0c и \ Кл.

\ N

Матч символ новой строки. Эквивалент \ x0A и \ Cj.

\ R

Матчи возврат каретки. Эквивалент \ x0D и \ сМ.

\ S

Соответствует пробельные символы, включая пробелы, символы табуляции, разрывы страниц и т.д. Эквивалент [\ е \ п \ г \ т \ v].

\ S

Соответствует непробельного символы. Эквивалент [^ \ е \ п \ г \ т \ v].

\ T

Вкладка Match. А \ x09 и \ ХИ эквивалентны.

\ V

Матчи вертикальной табуляции. А \ x0b и \ ск эквивалентны.

\ W

Соответствует любому класса символов, включая подчеркивание. А "[A-Za-z0-9_]" эквивалентны.

\ W

Соответствует любому символу, кроме буквы. А "[^ A-Za-z0-9_]" эквивалентны.

\Х п

Матчп,п здесь является шестнадцатеричным управляющие коды. Гексадесимал код выхода должен быть точно длиной две цифры. Например, "\ x41" соответствие "А". "\ X041" и "\ x04" и "1" эквивалентны. Позволяет использовать обычный код ASCII выражения.

\Num

MatchNum,Num здесь является положительным целым числом. Для захвата соответствия обратных ссылок. Например, "(.) \ 1" соответствует два последовательных одинаковых символов.

\N

Определяет восьмеричное код побега или обратные ссылки. Если \Ппредшествует по крайней мерепзахваченных подвыражениям, топявляется обратной ссылки. В противном случае, еслипявляется восьмеричное число (0-7), топявляется восьмеричное управляющие коды.

\Nm

Определяет восьмеричное код побега или обратные ссылки. Если \нмперед , по меньшей меренмподвыражению захвата, а затемнмявляется обратной ссылки. Если \нм, по меньшей мере , в переднейчасти пзахвата,пявляется обратная ссылка, следует символм.Если два предыдущих случая нет,\нм соответствует восьмеричноенм,гдепитявляются восьмеричные цифры (0-7).

\ NML

Припявляется восьмеричное число(0-3),м илявляются восьмеричное (0-7), он соответствует восьмеричные управляющие кодыNML.

\И п

Матчи,гдеппредставляет собой символ Unicode представлен четырьмя шестнадцатеричными числами. Например, \ u00a9 соответствует символ авторского права (©).

Методы Сличитель класса

Индексный метод

Методы индекс обеспечивают полезные значения индекса указывают точно, где найти входной строки совпадений:

Нет . Метод и Описание
1 общественное начало INT ()
Возвращает начальный индекс предыдущего матча.
2 публичного запуска INT (INT группа)
Назад в эксплуатацию во время предыдущего матча, захваченной данной группы подпоследовательности начального индекса
3 общественности INT конец ()
Возвращает смещение после того, как последний символ соответствует.
4 общественного INT конец (INT группа)
Назад в эксплуатацию в предыдущем матче, по заданному смещению после последней группы символов после последовательности захвата.

Методы исследования

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

Нет . Метод и Описание
1 общественного логический lookingAt ()
Try область с начала начала входной последовательности соответствует шаблону.
2 общественного логический находка ()
Попробуйте найти входную последовательность, которая соответствует шаблону следующей последовательности.
3 общественного логический поиск (целое начало)
Сбрасывает этот Matcher, а затем пытается найти соответствие образцу, введите следующую подпоследовательности, начиная с указанного индекса.
4 публичные логические совпадения ()
Попробуйте весь регион и для сравнения с шаблоном.

метод замены

Альтернатива заключается в замене строки в методе ввода текста:

Нет . Метод и Описание
1 общественного Сличитель appendReplacement (StringBuffer С.Б., String замены)
Для достижения нетерминальные дополнения и замены шаг.
2 общественного StringBuffer appendTail (StringBuffer С.Б.)
Достичь терминала дополнения и замены шаг.
3 Строка replaceAll общественности (замена String)
Режим замены с заданной строкой замены, чтобы соответствовать последовательности ввода для каждой последовательности.
4 Строка replaceFirst общественности (замена String)
Режим замены с заданной строкой замены, соответствующей входной последовательности первой подпоследовательности.
5 открытые статические Строка quoteReplacement (String s)
Возвращает строку символьной строки замены. Этот метод возвращает строку, которая передается в качестве метода для работы в классе appendReplacement Matcher как буквенная строка.

начальный и конечный метод

Вот пример числа вхождений во входной строке для подсчета появляется слово "кот":

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); // 获取 matcher 对象
       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());
      }
   }
}

Приведенные выше примеры скомпилированные получены следующие результаты:

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

Это можно увидеть, используя границы слов, например, чтобы гарантировать, что буква "с" "а" "т" не просто долго подстроки слово. Она также обеспечивает некоторую полезную информацию о входной строке совпавшего позиции.

Метод Start возвращает операцию во время предыдущего матча, от начального индекса данной группы захватили подпоследовательности, в конечном метод согласования последнего индекса плюс один символ.

спички и метод lookingAt

спички и методы lookingAt используются, чтобы попытаться соответствовать последовательности ввода шаблона. Они отличаются от требований всего матча последовательности Сличитель, но не lookingAt требуется.

Эти два метода часто используются в начинается входной строки.

Через следующий пример, чтобы объяснить эту особенность:

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());
   }
}

Приведенные выше примеры скомпилированные получены следующие результаты:

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

replaceFirst методы и replaceAll

replaceFirst и replaceAll метод, используемый для замены регулярного выражения соответствия текста. Разница, replaceFirst заменить первый матч, replaceAll заменить все матчи.

Следующий пример, чтобы объяснить эту особенность:

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);
   }
}

Приведенные выше примеры скомпилированные получены следующие результаты:

The cat says meow. All cats say meow.

appendReplacement методы и appendTail

Класс Сличитель также обеспечивает способ appendTail appendReplacement и заменить текст:

Посмотрите на следующий пример, чтобы объяснить эту особенность:

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);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Приведенные выше примеры скомпилированные получены следующие результаты:

-foo-foo-foo-

Методы класса PatternSyntaxException

PatternSyntaxException не является обязательным класс исключения, который указывает на регулярные синтаксические ошибки паттерн экспрессии.

Класс PatternSyntaxException предоставляет следующие методы, чтобы помочь нам увидеть, что произошла ошибка.

Нет . Метод и Описание
1 Строка getDescription общественности ()
Получить описание ошибки.
2 общественное INT GetIndex ()
Получите неправильный индекс.
3 Строка GetPattern общественности ()
Получить ошибочное шаблон регулярного выражения.
4 Строка GetMessage общественности ()
Возвращает строку из нескольких строк, содержащий описание ошибки синтаксиса и его индекс, визуальную индикацию ошибочного регулярного выражения, а также индекс ошибок.