有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

方法模式上的java正则表达式。编译()

我必须创建一个正则表达式来放入方法模式。编译(正则表达式); 我的正则表达式必须允许整数(数字开头不带0)、数字序列和字符(a-Za-z),但问题是第三点:必须以字符“'”开头和结尾的字符串必须避免字符反斜杠(除非没有其他反斜杠)和字符“'”(除非在反斜杠之前有)

但是我不明白如何做第二点(我遇到了很多错误),这是我的java代码:

public static void main(String[] args) {
    if (args.length == 0)
        throw new IllegalArgumentException();
    Matcher matcher = Pattern.compile("([a-zA-Z]+[0-9a-zA-Z_]*)|"
            + "(0(?![0-9])|([1-9]+)([0-9]*))|" //"?!" è una asserzione : " se la condizione tra parentesi è vera non considerare lo zero
            + "([\"]{1}(([\\\\][^\"\\][\\\"])*)[\"]{1})" 
            + "|(\\s+)").matcher(args[0]);// \s = [ \t\n\x0B\f\r]
    System.out.println("Input: " + args[0]); //println va a capo dopo la stampa
    while (matcher.lookingAt()) {
        System.out.print("Lexeme '" + matcher.group() + "'"); //non va a capo dopo la stampa
        System.out.println(" group " + ExampleLexer.getGroup(matcher));
        matcher.region(matcher.end(), matcher.regionEnd());
    }

     //attenzione: matcher.hitEnd() restituisce true se il matcher arriva in fondo
     //all'input anche se l'ultimo match non ha avuto successo, quindi funziona solo
     //per espressioni regolari "semplici"
    if (matcher.regionStart() == matcher.regionEnd())
        System.out.println("All lexems succesfully matched");
    else {
        System.err.print("Unmatched lexem ");
        matcher.usePattern(Pattern.compile(".*"));
        matcher.lookingAt();
        System.err.println(matcher.group());
    }
}

共 (1) 个答案

  1. # 1 楼答案

    "\"(\\\\.|[^\"\\\\])*\""            // (1)
    "\"(\\\\[\"\\\\]|[^\"\\\\])*\""     // (2)
    
    • 引用
    • 零次或多次()*
      • 反斜杠\后跟(1)任何字符./(2)任何非引号/非反斜杠
      • 或者|不是引号,不是反斜杠[^]
    • 引用

    关于逃跑:

    1. \"是一个字符串转义,表示一个字符,即双引号
    2. \\是表示反斜杠的字符串转义,一个字符
    3. \\\\是正则表达式转义\\,表示反斜杠本身,而不是正则表达式转义序列本身
    4. 如果你想替换反斜杠,首先在没有正则表达式的情况下尝试:s = s.replace("\\", "\\\\");将每个反斜杠加倍。猜猜这是如何用replaceAll在正则表达式中编写的