正则表达式示例混乱

时间:2013-06-25 19:51:55

标签: java regex regex-greedy

我正在为Oracle Certified Java Programmer做准备。我正在研究正则表达式。我正在浏览javaranch Regular Expression,我无法理解示例中的正则表达式。请帮助我理解它。我在这里添加源代码供参考。感谢。

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 个答案:

答案 0 :(得分:3)

你的正则表达式的例证:

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

Regular expression image

Edit live on Debuggex

答案 1 :(得分: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 }

答案 2 :(得分:1)

  • \\$:匹配一个字面的美元符号。没有反斜杠,它匹配字符串的结尾。
  • \\{:匹配文字大括号。
  • (:捕获组的开始
    • [^}]:匹配任何不是大括号的字符。
    • +:重复最后一个字符集,它将匹配一个或多个非大括号的字符。
  • ):关闭捕获组。
  • \\}:匹配文字结束大括号。

它匹配看起来像${key1}的内容。

答案 3 :(得分:1)

Here is a very good tutorial on regular expressions你可能想看看。 The article on quantifiers有两个部分“懒惰而不是贪婪”和“懒惰的替代”,这应该很好地解释这个特定的例子。

无论如何,这是我的解释。首先,您需要意识到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)访问,因为它是表达式中的第一组括号。

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