Java - 为什么这种模式匹配不起作用?

时间:2013-12-20 06:25:50

标签: java regex

public static String FILL_IN_THE_BLANK_REGEX = "\\\\[blank_.+\\\\]";

public static int getBlankCountForFillInTheBlank(String questionText) {
    Matcher m = Pattern.compile(FILL_IN_THE_BLANK_REGEX).matcher(questionText);
    int count = 0;
    while (m.find()) ++count;

    return count;
}

public static void main(String[] args) {
   System.out.println(getBlankCountForFillInTheBlank("abc [blank_tag1] abc [blank_tag2]")); // prints 1
}

但是,如果我做了像

这样的事情
public static String FILL_IN_THE_BLANK_REGEX = "\\\\[blank_tag.\\\\]";

打印2是正确的。

'+'在这里不起作用我不知道为什么。
(空白标签可以是[blank_someusertag])

2 个答案:

答案 0 :(得分:6)

请参阅javadoc for Pattern。我相信这是因为+是一个greedy量词,因此可以匹配所有内容。您可以在?之后添加+,以使其不情愿。

public static String FILL_IN_THE_BLANK_REGEX = "\\[blank_.+?\\]";

将打印

2

答案 1 :(得分:3)

.+将匹配任何字符1次或更多次。

使用非贪婪的?确保您只捕获到下一个定义的表达式。

您的工作表达:\\[blank_.+?\\]