2014-02-11 5 views
4

Поэтому у меня есть строка, какJava Regex Для Прописные

Восстановленный двигатель для 2000cc автомобилей

Я хотел бы, чтобы превратить это в

капремонта двигателя на 2000cc автомобиль

С капиталом куб. См на 2000CC. Я, очевидно, не могу сделать text.replaceAll("cc","CC");, потому что он заменит все вхождения cc версиями капитала, чтобы ускоритель слова стал aCCelerator. В моем случае ведущие четыре цифры всегда будут четыре цифры, за которыми следуют буквы cc, поэтому я полагаю, что это можно сделать с помощью регулярного выражения.

Мой вопрос в том, как на Java я могу превратить cc в CC, когда он будет 4 цифры и получить результат, который я ожидаю выше?

String text = text.replaceAll("[0-9]{4}[c]{2}", "?"); 
+0

Можно сказать, текст.toUpperCase(); – Zeus

+1

Вам, кстати, не нужны скобки, окружающие «c». ;) – tenub

+0

@Zeus. Затем будут помещены все остальные слова в сообщении в верхний регистр. Мне нужны ведущие колпачки, для которых я использую apaches WordUtils.CapitalizeFully для достижения этого. Спасибо за предложение. – Ashley

ответ

3

Если вы просто должны преобразовать cc в верхний регистр, и если она фиксирована, то вы можете просто заменить матч с CC.

В Java нет универсального решения однострочного интерфейса. Вы должны сделать это с Matcher#appendReplacement() и Matcher#appendTail():

String str = "Refurbished Engine for 2000cc Vehicles"; 
Pattern pattern = Pattern.compile("\\d{4}cc"); 
Matcher matcher = pattern.matcher(str); 

StringBuffer result = new StringBuffer(); 
while (matcher.find()) { 
    matcher.appendReplacement(result, matcher.group().toUpperCase()); 
} 

matcher.appendTail(result); 

System.out.println(result.toString()); 
+0

+1 всегда лучше иметь общее решение. – anubhava

+0

Спасибо. Это работает, а также работает для «Heater Control Pod Nearside (слева) 1700cc-2000cc». – Ashley

+0

@AshleySwatton Добро пожаловать :) –

7

Вы можете попробовать с

text = text.replaceAll("(\\d{4})cc", "$1CC"); 
//       ↓   ↑ 
//       +→→→→→→→→→→+ 

Трюк заключается в размещении номер в группе (через круглые скобки), а затем использования матча из этой группы в сменной части (через $x где x номер группы).

Вы можете окружить это регулярное выражение word boundaries"\\b", если вы хотите убедиться, что подобранный текст не является частью какого-либо другого слова. Вы также можете использовать механизмы look-adound, чтобы гарантировать отсутствие алфавитно-цифровых символов до и/или после согласованного текста.

+0

@Gene '\\ 1' работает в части регулярного выражения' $ 1' на заменяемой части – Pshemo

+0

Точно так же. Благодарю. Смешение строк Java и регулярных выражений (по сравнению с Perl, Ruby и т. Д., Где они встроены) возвращает меня снова и снова ... – Gene

+0

@Gene Нет проблем. Случается для всех :) – Pshemo

2

Один из способов заключаются в ловушку числовая части в группу с(), а затем использовать обратную ссылку к этой группе в замене:

Это тестируется:

public static void main(String [] args) { 
    String s = "1000cc abc 9999cc"; 
    String t = s.replaceAll("(\\d{4})cc", "$1CC"); 
    System.err.println(t); 
} 
2

Вы могли бы, возможно, сделать:

String text = text.replaceAll("(?<=\\b[0-9]{4})cc\\b", "CC"); 

(?<=\\b[0-9]{4}) является положительным, что будет с просмотром назад обеспечить соответствие только если cc предшествует 4 цифр (не более 4, и это правило в жизнь граница слова \\b (это соответствует только концам слова, где слово определяется как группа символов, соответствующая \\w+). Кроме того, поскольку lookbehinds являются утверждениями с нулевой шириной, они не учитываются в совпадении.

Если число куб.см может меняться, то это может быть простой проверкой только один номер:

String text = text.replaceAll("(?<=[0-9])cc\\b", "CC"); 
Смежные вопросы