Além de compile (), o Java Pattern tem um método sobrecarregado:
public static Pattern compile(String regex, int flags)
O sinalizador é uma constante na classe Pattern:
bandeira | Recursos |
---|---|
CASE_INSENSITIVE (? I) | Isso significa que o caso é ignorado na correspondência regular e é executado com caracteres US-ASCII. Pode ser combinado com a marca UNICODE_CASE, e a correspondência não diferencia maiúsculas de minúsculas baseada em Unicode pode ser ativada |
COMENTÁRIOS (? X) | Espaços em branco e comentários começando com # até o final da linha serão ignorados |
DOTALL (? S) | Neste modo, . corresponde a todos os caracteres, incluindo o padrão de nova linha, . corresponde a qualquer caractere diferente de uma nova linha |
MULTILINA (? M) | Mudança ^ e $ significado, para que correspondam ao início e ao final de qualquer linha, não apenas ao início e ao final de toda a string. Observação :(? M) em uma expressão regular envolvida apenas em várias linhas ^ e $ quando a correspondência usará o modo multilinha. |
UNIX_LINES (? D) | Em . , ^ , & agir apenas reconhecer quebras de linha\n |
Existem outros sinalizadores, você pode consultar as constantes e explicações em Padrão:
Vamos pegar algumas castanhas:
Modo multi-linha (? M)
No modo multilinhas, cada linha (o primeiro caractere desta linha ao final de cada linha) é correspondida.
public class MultiLinesFlags {
static public final String POEM =
"Twas brillig, and the slithy toves\n" +
"Did gyre and gimble in the wabe.\n" +
"All mimsy were the borogoves,\n" +
"And the mome raths outgrabe.\n\n" +
"Beware the Jabberwock, my son,\n" +
"The jaws that bite, the claws that catch.\n" +
"Beware the Jubjub bird, and shun\n" +
"The frumious Bandersnatch.";
public static void main(String[] args) {
// 这个正则表达式中有一个「$」行尾的匹配
// \S: 匹配任意不是空白符的字符
// \s: 匹配任意的空白符
Matcher m =
Pattern.compile("(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$")
.matcher(POEM);
while (m.find()) {
for (int j = 0; j <= m.groupCount(); j++)
print("[" + m.group(j) + "]");
print();
}
}
}
Ignorar maiúsculas e minúsculas (? I)
public class CaseSensitive {
public static void main(String[] args) {
// (?i) 忽略大小写
String reg = "(?i)((^[aeiou])|(\\s+[aeiou]))\\w+?[aeiou]\\b";
print("Regular expression: \"" + reg + "\"");
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher("Arline ate eight apples and one orange while Anita hadn't any");
while (m.find()) {
print("Match \"" + m.group() + "\" at position " +
m.start() + ((m.end() - m.start() < 2) ? "" : ("-" + (m.end() - 1))));
}
}
}
Combine vários sinalizadores
public class ConjunctionFlags {
public static void main(String[] args) {
Pattern p = Pattern.compile("^java",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher(
"java has regex\nJava has regex\n" +
"JAVA has pretty good regular expressions\n" +
"Regular expressions are in Java");
while (m.find())
System.out.println(m.group());
}
}
PS: As castanhas acima são todas de "Pensamentos de programação Java"