二重括弧で囲まれた文字列を抽出しようとしています。たとえば、一致する必要がある[[これは1つのトークンです]]。物事をよりエレガントにするためには、\ [[このエスケープされたトークン\]]のような二重括弧で囲まれた項目がマッチしないように、エスケープシーケンスがなければなりません。Javaの正規表現が期待通りに機能しない
トークンを抽出する "グループ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または空白を意味しないのでしょうか? – northpole