Как я могу выразить "не предшествовавший" в регулярном выражении Java? Например, я хотел бы искать ":" но только когда этому непосредственно не предшествуют "\". Как я могу сделать это?
Используйте отрицательный просмотр назад :
"(?<!\\\\):"
Причина появления четырех обратных косых черт:
\\
для соответствия одиночной обратной косой черте. \\
, что в сумме дает четыре. Пример кода:
Pattern pattern = Pattern.compile("(?<!\\\\):");
Matcher matcher = pattern.matcher("foo\\:x bar:y");
if (matcher.find()) {
System.out.println(matcher.start());
}
Вывод:
10
Вы пытались использовать класс символов с оператором дополнения?
String s1 = "foo : bar";
String s2 = "foo \\: bar";
Pattern p = Pattern.compile("[^\\\\]:");
Matcher m = p.matcher(s1);
if(m.find()) {
System.out.println(m.group());
}
m = p.matcher(s2);
if(m.find()) {
System.out.println(m.group());
}