0

我正在为 Oracle Certified Java Programmer 做准备。我正在研究正则表达式。我正在通过 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());
  }
}
4

4 回答 4

3

您的正则表达式的插图:

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

正则表达式图片

在 Debuggex 上实时编辑

于 2013-06-25T19:59:52.983 回答
1

解释:

\\$         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 }
于 2013-06-25T19:56:49.693 回答
1
  • \\$: 匹配文字美元符号。没有反斜杠,它匹配字符串的结尾。
  • \\{: 匹配文字左大括号。
  • (: 捕获组的开始
    • [^}]: 匹配任何不是右花括号的字符。
    • +: 重复最后一个字符集,它将匹配一个或多个不是花括号的字符。
  • ): 关闭捕获组。
  • \\}: 匹配文字结束大括号。

它匹配看起来像${key1}.

于 2013-06-25T19:56:51.367 回答
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 }

所以这真的匹配所有出现的${...}, where...可以是除了 close 之外的任何东西}。大括号(即...)的内容稍后可以通过 访问m.group(1),因为它是表达式中的第一组括号。

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

于 2013-06-25T19:59:32.153 回答