Ваше первоначальное регулярное выражение ((?!([ \*]))|^)\[[A-Za-z0-9\s]*\](?!\*)
пытается (но не может) сопоставить строки [...]
, если они не заключены в символы *
. В Java вы бы записали его как
(?<!\*)\[[A-Za-z0-9\s]*](?!\*)
String regexSearch = "(?<!\\*)\[[A-Za-z0-9\\s]*](?!\\*)";
Однако вы можете использовать более мягкое выражение, например
String regexSearch = "\\[[^\\]\\[|]*]";
Или, если вам нужно сохранить исходное поведение, чтобы оно не сработало совпадения внутри звездочек:
String regexSearch = "(?<!\\*)\\[[^\\]\\[|]*](?!\\*)";
См. демонстрацию regex .
Совпадения:
(?<!\*)
- отрицательный взгляд сзади которая не соответствует, если слева от текущего местоположения есть *
символ \[
- [
символ [^\]\[|]*
- 0 или более символов другого типа чем [
, ]
и |
]
- ]
char (?!\*)
- отрицательный прогноз, который не дает совпадения при наличии *
char непосредственно справа от текущего местоположения.
Таким образом, он будет совпадать с [
до ближайшего ]
без сопоставления с другими [
и |
внутри, т.е. будет соответствовать внутренняя подстрок в квадратных скобках. Это также позволит использовать любые другие специальные и невидимые символы в скобках, такие как дефисы, апострофы и т. Д. c. [A-Za-z0-9\s]
разрешены только ASCII буквы, цифры и пробелы.
Java demo :
String regexSearch = "\\[[^\\]\\[|]*]";
String regexReplacement = "*$0*";
String inputString = "This is a User, [USER 1], and a second user [USER 2] not [USER | 3]";
Pattern p = Pattern.compile(regexSearch);
Matcher m = p.matcher(inputString);
System.out.println(m.replaceAll(regexReplacement));
// => This is a User, *[USER 1]*, and a second user *[USER 2]* not [USER | 3]