2013-11-27 3 views
0

как я могу фильтровать строку?как фильтровать строку, но сохранить некоторые теги

String[] filterTags={<A>,<BC>,<A,<B};

filterTags может содержит больше значений, он может содержит строку, число или что-нибудь может вырасти dyanmically

String name="<A><ABC><B><B" 

то, что я хочу удалить значения из filterTags массива, но сохранить <ABC> как бы от названия (String)

if (name.contains(filterTags[i])and ???) 

мне нужно только простую проверку, которая удалит значения filterTags, если содержит в имени (String), но сохранить как это

спасибо в пожилом

+1

Я запутался - какой код у вас в настоящее время, что работает или то, что вы делали до сих пор? Какая логика диктует удаление тегов, отличных от «». Каким должно быть конечное состояние строки? –

+0

Мне нужна простая проверка, которая будет удалять значения filterTags, если они содержат от имени, но сохраняют , так как это – user2940158

ответ

1

Ну, вы можете сделать это с помощью регулярных выражений:

String filtered = name.replaceAll("(<A>|<BC>|<A|<B)", ""); 
// filtered == "<ABC>" 

Проблема заключается в создании этой строки регулярных выражений. Вы можете жёстко его, так как он выглядит, что это то, что вы делаете с массивом в любом случае, или вы могли бы сделать что-то вроде этого:

StringBuilder sb = new StringBuilder("("); 
for (String token : filterTags) { 
    sb.append(token); 
    sb.append('|'); 
} 
sb.deleteCharAt(sb.length() - 1); // Remove the last "|" 
sb.append(')'); 
String regex = sb.toString(); 

Обратите внимание, что это будет работать, только если теги фильтр не содержат какой-либо регулярных выражений специальные символы

+0

Очень незначительная, но хорошая практика, оптимизация - используйте 'sb.append ('|')' и 'sb.append (')') '. Если его единственный символ, который получает append, он сохраняет StringBuilder совсем немного работы в определении размера строки, распаковывая ее на символы и добавляя каждый символ. Сравните [StringBuilder.append (String)] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.append% 28java.lang.String% 29) на вызов добавления на основе char. –

+0

@MichaelT Спасибо, я этого не знал. Ред. – quazzieclodo

+0

Thats только для 'append()' call - не существует для конструктора (который все еще берет String (или int для емкости)). –

0

Просто вы можете сделать это с помощью регулярных выражений

String name = "<A><ABC><c<B<s"; 
     pattern = Pattern.compile(".*(<ABC>).*"); 
     matcher = pattern.matcher(name); 
     matcher.matches(); 
     System.out.println(matcher.group(1)); // prints <ABC> 
Смежные вопросы