Я создаю функцию, которая удаляет недопустимые шаблоны из входной строки. Идеальное решение должно использовать одно выражение регулярного выражения, если это вообще возможно.
Недопустимые шаблоны: %%
и %_%
. Каждый их экземпляр должен быть заменен на %
.
Вот в чем дело ... Я пытаюсь выполнить нечеткое тестирование, запустив функцию для разных входов, чтобы попытаться сделать это и сломать ее.
Работает по большей части; однако со сложными входами это не так.
Остальная часть этого вопроса была обновлена:
Следующие входные данные должны возвращать пустую строку (не исчерпывающий список):
Следующие входные данные должны возвращать %
(не исчерпывающий список).
- % _%
- %%
- %% _ %%
- % _ %%%
- %% _% _%
- %% _ %%% %%% _ _%
В некоторых случаях вводятся другие символы ... например:
- Foo123% _%
- B4r $% _%
- B4rs %% _%
- %% Lorem _ %%
- Должен вернуть "% Lorem _%"
Я попытался использовать несколько разных шаблонов, и мои тесты не пройдены.
String input = "%_%%%%_%%%_%";
// old method:
public static String ancientMethod1(String input){
if (input == null)
return "";
return input.replaceAll("%_%", "").replaceAll("%%", ""); // Output: ""
}
// Attempt 1:
// Doesn't quite work right.
// "A%%" is returned as "A%%" instead of "A%"
public static String newMethod1(String input) {
String result = input;
while (result.contains("%%") || result.contains("%_%"))
result = result.replaceAll("%%","%").replaceAll("%_%","%");
if (result.equals("%"))
return "";
return input;
}
// Attempt 2:
// Succeeds, but I would like to simplify this:
public static String newMethod2(String input) {
if (input == null)
return "";
String illegalPattern1 = "%%";
String illegalPattern2 = "%_%";
String result = input;
while (result.contains(illegalPattern1) || result.contains(illegalPattern2)) {
result = result.replace(illegalPattern1, "%");
result = result.replace(illegalPattern2, "%");
}
if (result.equals("%") || result.equals("_"))
return "";
return result;
}
Вот более полный пример того, как я использую это: https://gist.github.com/sometowngeek/697c839a1bf1c9ee58be283b1396cf2e