Поэтому мне нужно вернуть измененную строку, где она заменяет первый экземпляр токена другим токеном при пропуске комментариев. Вот пример того, что я говорю:Как написать регулярное выражение в Java, которое будет выполнять .replaceFirst в группе, которая не находится в комментарии?
This whole quote is one big String
-- I don't want to replace this @@
But I want to replace this @@!
Будучи бывшим разработчиком .NET, я думал, что это было легко. Я бы просто сделать отрицательное назад ', как это:
(?<!--.*)@@
Но потом я узнал, Java не может это сделать. Поэтому, узнав, что фигурные скобки в порядке, я попытался это:
(?<!--.{0,9001})@@
Это не сгенерирует исключение, но это не соответствует @@ в комментарии.
Когда я тестирую это регулярное выражение с помощью тестера регулярных выражений Java, он работает так, как ожидалось. Единственное, о чем я могу думать, это то, что я использую Java 1.5. Возможно ли, что в Java 1.5 есть ошибка в его регулярном выражении? Предполагая, что это так, как я получу Java 1.5, чтобы сделать то, что я хочу, чтобы не обрезать свою строку и повторно собрать ее?
EDIT Я изменил оператор # на оператор, так как похоже, что регулярное выражение будет более сложным с двумя символами вместо одного. Я изначально не показывал, что я изменял запрос, чтобы избежать обсуждения темы на тему «Ну, вы не должны изменять запросы таким образом!» У меня есть очень веская причина для этого. Пожалуйста, не обсуждайте передовую практику изменения запроса. Спасибо
Так что вы хотите заменить '' @@ в 3-м примере, а не на 2-й один? –
В регулярном выражении Java вы не можете указывать длину «конечного числа» или регулярное выражение с неясной длиной на внешний вид. Некоторые языки даже ограничивают его регулярным выражением постоянной длины в look-behind. .NET - единственный, который я знаю, который поддерживает произвольный внешний вид длины. – nhahtdh