Java перегружает регулярные выражения - PullRequest
0 голосов
/ 16 декабря 2009

Я хочу заменить один <, но не <<, используя регулярное выражение Java (поэтому я работаю с String.replaceAll ()). Прямо сейчас у меня есть </p>

([^<]|^)<([^<]|$)

, который работает на Python, но не на Java. Я также пробовал негативно осмотреться, с чем-то вроде

(?<!<)<(?!<)

Однако все мои текущие попытки также совпадают с <<. Я делаю что-то неправильно? Есть ли здесь какие-либо особенности Java, о которых я не знаю? </p>

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Ваш первый регулярное выражение содержит класс символов ([^<]|^). Это положительное совпадение, поэтому все, что попадется в класс персонажа, будет заменено на replaceAll().

Ваш второй регулярное выражение использует только lookaround, который только проверяет условие и не соответствует:

(?<!<)<(?!<)

Это прекрасно работает для меня: оно не соответствует <<. Возможно, вы можете опубликовать фрагмент кода и некоторый ввод / вывод, который не будет вести себя так, как вы ожидаете?

1 голос
/ 16 декабря 2009

Если вы хотите заменить одно «<» на «X», скажем, сделайте следующее: </p>

String test = "hello << world < blah < blah << blah";

String _test = test.replaceAll("(^|[^<])<([^<]|$)", "$1X$2");

System.out.println(_test);

Дает вам это:

hello << world X blah X blah << blah

Редактировать Обновлен для соответствия в начале и конце строки

0 голосов
/ 16 декабря 2009

Возможно, вы используете неправильную замену?

\ n используется только для обратной ссылки на группу захвата на стороне шаблона. Вы должны использовать $ n, чтобы использовать его на стороне замены.

См. http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29 для документации по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...