2016-07-04 2 views
1

У меня есть на следующие строки, например:Заменить определенную последовательность символов после специфического характера

O > O §o TEXT §r §o TEXT §r 

Мне нужно заменить все§r с §r§aтолько после > характера.

Это должно быть

O > O §o TEXT §r§a §o TEXT §r§a 

в качестве результата.

Я попытался > * (\ §r) регулярного выражения, но он игнорирует >.

Возможно, вы указали мою ошибку?

ответ

1

Самый простой способ сделать это - сначала разбить его на две строки, а затем запустить replace. То есть, вы могли бы принять

int index = inputString.indexOf('>') + 1; 
String first = inputString.subString(0, index); 
String second = inputString.subString(index); 
String finalString = first + second.replace("§r", "§r§a"); 

Выполнение этого с использованием обычного регулярного выражения было бы затруднительным.

+0

Да; но вы также можете проверить, что '>' находится в первой строке; этот код заменит все '§r' на строку, которая этого не делает. –

+0

@AndyTurner это правильно. Я оставил отказоустойчивые проверки в интересах простоты ответа. –

1

Описание

((?:(?!>).)*>.*?|)(§r) 

Regular expression visualization

Заменить:$1§r§a

** Для того, чтобы увидеть изображение лучше, просто щелкните правой кнопкой мыши на изображение и выберите пункт Открыть в новом окне

Пример

Демо

https://regex101.com/r/xP8dI5/1

Пример текста

§r O > O §o TEXT §r §o TEXT §r 

После Replacment

§r O > O §o TEXT §r§a §o TEXT §r§a 

Объяснение

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (0 or more 
          times (matching the most amount 
          possible)): 
---------------------------------------------------------------------- 
     (?!      look ahead to see if there is not: 
---------------------------------------------------------------------- 
     >      '>' 
---------------------------------------------------------------------- 
    )      end of look-ahead 
---------------------------------------------------------------------- 
     .      any character except \n 
---------------------------------------------------------------------- 
    )*      end of grouping 
---------------------------------------------------------------------- 
    >      '>' 
---------------------------------------------------------------------- 
    .*?      any character except \n (0 or more times 
          (matching the least amount possible)) 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    §r      '§r' 
---------------------------------------------------------------------- 
)      end of \2 
---------------------------------------------------------------------- 
+0

Но с кодом типа String OriginalMessage = "O§r> O §o ТЕКСТ §r §о ТЕКСТ §r"; String Message; Message = OriginalMessage.replaceAll ("((?: (?!>).) *>. *? |) (§r)", "§§§а"); System.out.println (Message); Он выводит только «§§§§§§§§§§§§§§§§§§» –

+0

Я не вижу того же выхода https://regex101.com/r/xP8dI5/2 –

0

Чистый регулярное выражение способ заключается в использовании \G как следующая

(\G(?!\A)|>)(.*?)§r 

и замените

$1$2§r§a 

Regex Demo

Java Code

System.out.println("O§r §r > O §o TEXT §r §o §r TEXT §r".replaceAll("(\\G(?!\\A)|>)(.*?)§r", "$1$2§r§a")); 

Ideone Demo

Смежные вопросы