O que são "(? I)" e "(? M)" na frente do Java regular?

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:
Insira a descrição da imagem aqui
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"

Acho que você gosta

Origin blog.csdn.net/jiaobuchong/article/details/100051103
Recomendado
Clasificación