Spec-Zone .ru
спецификации, руководства, описания, API
|
До сих пор мы только использовали тестовый ремень безопасности, чтобы создать Pattern
объекты в их наиболее канонической форме. Этот раздел исследует усовершенствованные методы, такие как создание образцов с флагами и использованием встроенных выражений флага. Это также исследует некоторые дополнительные полезные методы, которые мы еще не обсудили.
Pattern
class определяет альтернативу compile
метод, который принимает ряд флагов, влияющих на путь образец, является соответствующим. Параметр флагов является небольшим количеством маски, которая может включать любое из следующих общедоступных статических полей:
Pattern.CANON_EQ
Включает канонической эквивалентности. Когда этот флаг будет определен, два символа, как будут полагать, будут соответствовать, если, и только если, их полные канонические разложения соответствуют. Выражение "a\u030A"
, например, будет соответствовать строку "\u00E5"
когда этот флаг определяется. По умолчанию соответствие не принимает каноническую эквивалентность во внимание. Определение этого флага может наложить потерю производительности.Pattern.CASE_INSENSITIVE
(?i)
. Определение этого флага может наложить небольшую потерю производительности.Pattern.COMMENTS
#
игнорируются до конца строки. Режим комментариев может также быть включен через встроенное выражение флага (?x)
.Pattern.COMMENTS
Pattern.DOTALL
.
соответствия любой символ, включая разделитель строки. По умолчанию это выражение не соответствует разделители строки. Режим Dotall может также быть включен через встроенное выражение флага (?s)
. (S является мнемосхемой для "однострочного" режима, который является тем, что это вызывают в Perl.)Pattern.LITERAL
CASE_INSENSITIVE
и UNICODE_CASE
сохраните их воздействие на соответствие когда использующийся в соединении с этим флагом. Другие флаги становятся лишними. Нет никакого встроенного символа флага для того, чтобы включить литеральному парсингу.Pattern.MULTILINE
^
и $
соответствие сразу после или как раз перед, соответственно, разделитель строки или конец входной последовательности. По умолчанию эти выражения только соответствуют вначале и конец всей входной последовательности. Многострочный режим может также быть включен через встроенное выражение флага (?m)
.Pattern.UNICODE_CASE
CASE_INSENSITIVE
отметьте, делается способом, непротиворечивым со Стандартом Unicode. По умолчанию нечувствительное к регистру соответствие предполагает, что только символы в наборе символов US-ASCII являются соответствующими. Осведомленное о Unicode сворачивание случая может также быть включено через встроенное выражение флага (?u)
. Определение этого флага может наложить потерю производительности.Pattern.UNIX_LINES
'\n'
разделитель строки распознается в поведении .
, ^
, и $
. Режим строк Unix может также быть включен через встроенное выражение флага (?d)
.В следующих шагах мы изменим тестовый ремень безопасности, 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
Можно найти, что следующие методы несколько полезны также:
public static String quote(String s)
Возвращает литеральный образец String
для указанного String
. Этот метод производит a String
это может использоваться, чтобы создать a Pattern
это соответствовало бы String s
как будто это был литеральный образец. Метасимволам или escape-последовательностям во входной последовательности не дадут особого значения.public String toString()
String
представление этого образца. Это - регулярное выражение, от которого был скомпилирован этот образец.java.lang.String
Поддержка регулярного выражения также существует в java.lang.String
через несколько методов, которые подражают поведению java.util.regex.Pattern
. Для удобства ключевые выборки от их API представляются ниже.
public boolean matches(String regex)
str.matches(regex)
урожаи точно тот же самый результат как выражение Pattern.matches(regex, str)
.public String[] split(String regex, int limit)
str.split(regex, n)
приводит к тому же самому результату как выражение Pattern.compile(regex).split(str, n)
public String[] split(String regex)
Есть также метод замены, который заменяет тот CharSequence
с другим:
public String replace(CharSequence target,CharSequence replacement)