2009-10-10 3 views
1

Я пытаюсь очистить одну строку от другой.Java: str.replaceAll() не работает

before = before.replaceAll(Constants.GENE_START_SEQUENCE, ""); 

И тем не менее, следующее утверждение иногда не:

assert before.indexOf(Constants.GENE_START_SEQUENCE) == -1 : before; 

Это то, что утверждает выплевывает:

IIAOOOCOAAAOCCIOOOACAIAOACICOOIAIOOICIIOIIOICOICCCOOAOICOCOOIIOOAOAACIIOCCICIOIII 
+6

Если вы можете предоставить автономный пример, включая указанные константы, который демонстрирует описанное поведение, я дам вам cookie. –

+0

Что такое Constants.GENE_START_SEQUENCE? – llamaoo7

ответ

11

replaceAll только заменяет вхождения шаблона в исходной строке. Если шаблон повторится в результате замены, это новое появление не будет заменено. Пример:

"XXYY".replaceAll("XY", ""); 

Это обнаружит одно появление «XY» (по индексу 1), а затем замените его на «». Результатом будет «XY». Если вы хотите, чтобы это не происходило, вам нужно повторно выполнить замену ALL, пока replaceAll не перестанет находить совпадение.

String string = "XXYY"; 
String oldString; 
do { 
    oldString = string; 
    string = string.replaceAll("XY", ""); 
} while(!string.equals(oldString)); 
// string will now be "" 
+0

@ Аарон: Спасибо за исправление. – sepp2k

2

Вы должны убедиться, что Constants.GENE_START_SEQUENCE является допустимым шаблоном регулярного выражения. Если это не должно быть регулярным выражением, вам следует избегать его с помощью метода quote на java.util.regex.Pattern.