Java 正则表达式示例混淆

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[

我正在为Oracle认证的Java程序员做准备。我正在研究正则表达式。我正在浏览javaranch,我无法理解示例中的正则表达式。请帮助我理解它。我在这里添加源代码以供参考。谢谢

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)
访问,因为它是表达式中的第一组括号

以下是上述教程中一些更相关的文章(但您应该真正完整地阅读它——它确实值得一读):

  • (包括如何用
    ^
    否定它们)
您可能想退房。有两个部分“懒惰而不是贪婪”和“懒惰的替代品”,这应该能很好地解释这个特殊的例子

不管怎样,这是我的解释。首先,您需要认识到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)
访问,因为它是表达式中的第一组括号

以下是上述教程中一些更相关的文章(但您应该真正完整地阅读它——它确实值得一读):

  • (包括如何用
    ^
    否定它们)

    • 您的正则表达式示例:

      \$\{([^}]+)\}
      


      您的正则表达式的示例:

      \$\{([^}]+)\}
      



      在那段代码中,您不明白什么?我无法分离正则表达式。首先,你能帮助我这个正则表达式解释什么吗。@benz:看看这个:它寻找像
      ${key1}
      ${key2}
      这样的东西……你在那个代码中不明白什么?我无法分离正则表达式。首先,你能帮我解释一下这个正则表达式解释了什么吗。@benz:看看这个:它查找像
      ${key1}
      ${key2}
      之类的东西……谢谢Blender。我对许多地方和博客感到困惑,这些地方和博客从一开始就被它解释了。另外,在这个正则表达式中,$符号有什么用?@benz:你知道这个正则表达式是做什么的吗?Blender对我来说,它试图找到所有发生的事情{}。很抱歉,我现在对正则表达式非常陌生。@benz字符类有自己的元字符-其中一些与字符类之外的元字符相同,但它们可能有不同的含义。谢谢Blender。我对许多地方和博客感到困惑,这些地方和博客从一开始就被它解释了。另外,在这个正则表达式中,$符号有什么用?@benz:你知道这个正则表达式是做什么的吗?Blender对我来说,它试图找到所有发生的事情{}。很抱歉,我现在对正则表达式非常陌生。@benz字符类有自己的元字符-其中一些与字符类之外的元字符相同,但它们可能有不同的含义。谢谢buettner。我将详细研究本教程,然后回到这个示例,以便理解。因为我现在很困惑,很多博客都说^,它的意思是行的开始,而不是否定。@benz如果你在字符类之外使用它,它确实是。但在字符类中,这种意义没有意义,因为“字符串/行的开头”不是字符(而是位置)。因此,它在字符类中可能有不同的含义。如果它是第一个字符,则否定该类。如果它位于字符类中的任何其他位置,它将被简单地视为一个文本
      ^
      。谢谢buettner。我将详细研究本教程并返回到