【发布时间】:2009-06-25 16:55:22
【问题描述】:
试图提取用双括号括起来的字符串。例如应该匹配的 [[this is one token]]。为了使事情更优雅,应该有一个转义序列,以便像 \[[this escaped token\]] 这样的双括号项目不会被匹配。
使用“group 1”提取令牌的模式[^\\\\]([\\[]{2}.+[^\\\\][\\]]{2}) 很接近,但在某些情况下它不起作用。问题似乎是第一个“not”语句被评估为“除了反斜杠之外的任何内容”。问题是,“任何东西”不包括“无”。那么,是什么让这个模式匹配“除了反斜杠之外的任何字符或任何字符”?
这是一个显示所需行为的单元测试:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import junit.framework.TestCase;
public class RegexSpike extends TestCase {
private String regex;
private Pattern pattern;
private Matcher matcher;
@Override
protected void setUp() throws Exception {
super.setUp();
regex = "[^\\\\]([\\[]{2}.+[^\\\\][\\]]{2})";
pattern = Pattern.compile(regex);
}
private String runRegex(String testString) {
matcher = pattern.matcher(testString);
return matcher.find() ? matcher.group(1) : "NOT FOUND";
}
public void testBeginsWithTag_Passes() {
assertEquals("[[should work]]", runRegex("[[should work]]"));
}
public void testBeginsWithSpaces_Passes() {
assertEquals("[[should work]]", runRegex(" [[should work]]"));
}
public void testBeginsWithChars_Passes() {
assertEquals("[[should work]]", runRegex("anything here[[should
work]]"));
}
public void testEndsWithChars_Passes() {
assertEquals("[[should work]]", runRegex("[[should
work]]with anything here"));
}
public void testBeginsAndEndsWithChars_Passes() {
assertEquals("[[should work]]", runRegex("anything here[[should
work]]and anything here"));
}
public void testFirstBracketsEscaped_Fails() {
assertEquals("NOT FOUND", runRegex("\\[[should NOT work]]"));
}
public void testSingleBrackets_Fails() {
assertEquals("NOT FOUND", runRegex("[should NOT work]"));
}
public void testSecondBracketsEscaped_Fails() {
assertEquals("NOT FOUND", runRegex("[[should NOT work\\]]"));
}
}
【问题讨论】:
-
没有什么意思是 NULL 或空白吗?