2016-04-04 3 views
0

Я читал в строках из текстового файлаСтрока replaceALL с условиями на письма до и после матча

Пример: Является ли Миссисипи государство, где есть много систем?

Я пытаюсь заменить все, чтобы заменить все «s» & «S» с одним и тем же случаем «t» или «T», если только в начале слова и если до или после «s» или «s», S "есть другое" s "или" S ".

Ожидаемый результат: Это Миссисипи - государство, в котором много сыттем?

Я попытался ...

.replaceAll("[^sStT](?!\\b)S", "T").replaceAll("[^SstT](?!\\b)s", "t"); 

Выход был ... "т Mtstsippi государство, где есть много Sttet?"

+0

.replaceAll ("[^ sStT] (?! \\ б) С", "Т"). ReplaceAll ("[^ SstT] (?! \\ б) с", "т") ; Выход был ... «t Mtstsippi a State, где много Sttet?» – Hedgebox

+0

И какой результат это дает вам? – Gendarme

+0

Добавьте дополнительную информацию (ваш код и полученный результат) на вопрос, а не в комментарии. – RealSkeptic

ответ

1

Вы можете сделать это с помощью двух звонков replaceAll. один для s -> t и один для S -> T

Вы можете использовать внешний вид-за (?<=regex) и упреждающую (?=regex) группы, чтобы найти шаблон без замены его содержимого.

Отслеживание будет проверять, что символ до s отсутствует в списке символов [^<list>]. Этот список включает в себя стартовый символ ^ и sS и tT и пробельные \\s

(?<=[^^\\ssStT])

Взгляд вперед будет делать подобную проверку, но только проверить следующий символ не sS

(?=[^sS])

Все это вместе:

String test = "Is Mississippi a State where there are a lot of Systems?"; 
System.out.println(test 
     .replaceAll("(?<=[^^\\ssStT])s(?=[^sS])","t") 
     .replaceAll("(?<=[^^\\ssStT])S(?=[^sS])","T") 
); 
1

Я знаю, что есть уже принятый ответ, но вот еще один способ добиться того, что вы хотите, используя небольшой java-хак и отрицательный lookbehind/after.

String s = "Is Mississippi a State where there are a lot of Systems?"; 
s = s.replaceAll("(?<![ sS])(s|S)(?![sS])", Character.isUpperCase("$1".charAt(0)) ? "T" : "t"); 
System.out.println(s); // It Mississippi a State where there are a lot of Syttemt? 
+0

Я запутался, как '' $ 1 ".charAt (0)' фактически получает свое значение .. не будет ' $ 1' быть оценено до вызова 'replaceAll'? – flakes

+0

На самом деле я только что проверил это с помощью капитальных символов! этот второй параметр всегда оценивается как «t» во всех случаях. Вы смотрите на '' $ '' – flakes

+0

@flkes. Вы правы. Как вы думаете, каким будет решение? –

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