Попытка извлечь строки, заключенные в двойные скобки. Например, [[это один токен]], который должен соответствовать. Чтобы сделать вещи более элегантными, должна быть escape-последовательность, чтобы элементы в двойных скобках, такие как \ [[escape-токен \]], не сопоставлялись.
Шаблон [^\\\\]([\\[]{2}.+[^\\\\][\\]]{2})
с «группой 1» для извлечения токена близок, но есть ситуации, когда он не работает. Кажется, проблема в том, что первое утверждение «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\\]]"));
}
}