我必须创建一个正则表达式以放入Pattern.compile(regex)方法; 我的正则表达式必须允许整数(在数字的开头没有0),一系列数字和字符(A-Za-z),但问题是第三点:一个必须以char&开头和结尾的字符串#39; " ',必须避免使用字符反斜杠(除非没有另外一个反斜杠)和char''' (除非有反斜杠之前)
但我不明白如何做第二点(我遇到了很多错误),这是我的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());
}
}
答案 0 :(得分:0)
value
"\"(\\\\.|[^\"\\\\])*\"" // (1)
"\"(\\\\[\"\\\\]|[^\"\\\\])*\"" // (2)
... (
)*
后跟(1)任何char \
/(2)任何非引用/非反斜杠.
不是引用,不是反斜杠|
... [^
逃脱:
]
是一个String转义符,表示一个char,双引号。\"
是表示反斜杠的字符串转义符,一个字符。\\
是正则表达式转义\\\\
来表示反斜杠本身而不是正则表达式转义序列本身。\\
每个反斜杠加倍。猜猜如何使用s = s.replace("\\", "\\\\");
在正则表达式中编写它。