Java 正则表达式示例混淆
我正在为Oracle认证的Java程序员做准备。我正在研究正则表达式。我正在浏览javaranch,我无法理解示例中的正则表达式。请帮助我理解它。我在这里添加源代码以供参考。谢谢Java 正则表达式示例混淆,java,regex,regex-greedy,Java,Regex,Regex Greedy,我正在为Oracle认证的Java程序员做准备。我正在研究正则表达式。我正在浏览javaranch,我无法理解示例中的正则表达式。请帮助我理解它。我在这里添加源代码以供参考。谢谢 class Test { static Map props = new HashMap(); static { props.put("key1", "fox"); props.put("key2", "dog"); } public static void main(String[
class Test
{
static Map props = new HashMap();
static
{
props.put("key1", "fox");
props.put("key2", "dog");
}
public static void main(String[] args)
{
String input = "The quick brown ${key1} jumps over the lazy ${key2}.";
Pattern p = Pattern.compile("\\$\\{([^}]+)\\}");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer();
while (m.find())
{
m.appendReplacement(sb, "");
sb.append(props.get(m.group(1)));
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
说明:
\\$ literal $ (must be escaped since it is a special character that
means "end of the string"
\\{ literal { (i m not sure this must be escaped but it doesn't matter)
( open the capture group 1
[^}]+ character class containing all chars but }
) close the capture group 1
\\} literal }
说明:
\\$ literal $ (must be escaped since it is a special character that
means "end of the string"
\\{ literal { (i m not sure this must be escaped but it doesn't matter)
( open the capture group 1
[^}]+ character class containing all chars but }
) close the capture group 1
\\} literal }
:匹配文字美元符号。如果没有反斜杠,它将匹配字符串的结尾\\$
:匹配文字开头的花括号\\{
:开始捕获组(
:匹配任何不是右大括号的字符[^}]
:重复最后一个字符集,该字符集将匹配一个或多个非大括号字符+
:关闭捕获组)
:匹配文字结尾的花括号\\}
${key1}
:匹配文字美元符号。如果没有反斜杠,它将匹配字符串的结尾\\$
:匹配文字开头的花括号\\{
:开始捕获组(
:匹配任何不是右大括号的字符[^}]
:重复最后一个字符集,该字符集将匹配一个或多个非大括号字符+
:关闭捕获组)
:匹配文字结尾的花括号\\}
${key1}
您可能想要签出。有两个部分“懒惰而不是贪婪”和“懒惰的替代品”,这应该能很好地解释这个特殊的例子
不管怎样,这是我的解释。首先,您需要认识到Java中有两个编译步骤。将代码中的字符串文字编译为实际字符串。这一步已经解释了一些反斜杠,因此Java接收的字符串如下所示
\$\{([^}]+)\}
现在让我们在自由间距模式下将其分开:
\$ # match a literal $
\{ # match a literal {
( # start capturing group 1
[^}] # match any single character except } - note the negation by ^
+ # repeat one or more times
) # end of capturing group 1
\} # match a literal }
因此,这确实匹配所有出现的${…}
,其中..
可以是除关闭}
之外的任何内容。大括号(即…
)的内容稍后可以通过m.group(1)
访问,因为它是表达式中的第一组括号
以下是上述教程中一些更相关的文章(但您应该真正完整地阅读它——它确实值得一读):
- (包括如何用
否定它们)^
\$\{([^}]+)\}
现在让我们在自由间距模式下将其分开:
\$ # match a literal $
\{ # match a literal {
( # start capturing group 1
[^}] # match any single character except } - note the negation by ^
+ # repeat one or more times
) # end of capturing group 1
\} # match a literal }
因此,这确实匹配所有出现的${…}
,其中..
可以是除关闭}
之外的任何内容。大括号(即…
)的内容稍后可以通过m.group(1)
访问,因为它是表达式中的第一组括号
以下是上述教程中一些更相关的文章(但您应该真正完整地阅读它——它确实值得一读):
- (包括如何用
否定它们)^
- 您的正则表达式示例:
\$\{([^}]+)\}
您的正则表达式的示例:
\$\{([^}]+)\}
在那段代码中,您不明白什么?我无法分离正则表达式。首先,你能帮助我这个正则表达式解释什么吗。@benz:看看这个:它寻找像
${key1}
和${key2}
这样的东西……你在那个代码中不明白什么?我无法分离正则表达式。首先,你能帮我解释一下这个正则表达式解释了什么吗。@benz:看看这个:它查找像${key1}
和${key2}
之类的东西……谢谢Blender。我对许多地方和博客感到困惑,这些地方和博客从一开始就被它解释了。另外,在这个正则表达式中,$符号有什么用?@benz:你知道这个正则表达式是做什么的吗?Blender对我来说,它试图找到所有发生的事情{}。很抱歉,我现在对正则表达式非常陌生。@benz字符类有自己的元字符-其中一些与字符类之外的元字符相同,但它们可能有不同的含义。谢谢Blender。我对许多地方和博客感到困惑,这些地方和博客从一开始就被它解释了。另外,在这个正则表达式中,$符号有什么用?@benz:你知道这个正则表达式是做什么的吗?Blender对我来说,它试图找到所有发生的事情{}。很抱歉,我现在对正则表达式非常陌生。@benz字符类有自己的元字符-其中一些与字符类之外的元字符相同,但它们可能有不同的含义。谢谢buettner。我将详细研究本教程,然后回到这个示例,以便理解。因为我现在很困惑,很多博客都说^,它的意思是行的开始,而不是否定。@benz如果你在字符类之外使用它,它确实是。但在字符类中,这种意义没有意义,因为“字符串/行的开头”不是字符(而是位置)。因此,它在字符类中可能有不同的含义。如果它是第一个字符,则否定该类。如果它位于字符类中的任何其他位置,它将被简单地视为一个文本^
。谢谢buettner。我将详细研究本教程并返回到