Я пытаюсь решить следующее упражнение для разработки, основанной на тестах, по этой ссылке http://osherove.com/tdd-kata-1/, и я застрял чуть ближе к концу требований.Как извлечь части определенной строки с регулярным выражением?
Я всегда боялся регулярных выражений, но мне кажется, что я должен их изучить. Во всяком случае, я пытаюсь сделать следующее: - возьмите строку, извлеките из нее цифры и суммируйте их. Требование, что это меня беспокоит то, что один
Разрешить несколько разделителей, как это: «// [delim1] [delim2] \ п», например «// [*] [%] \ n1 * 2% 3» должен вернуться 6. Убедитесь, что вы также можете обрабатывать несколько разделителей длиной более одного символа.
Требование означает, что я должен извлечь delim1
, delim2
и т.д. из строки, начиная с //
и заканчивая новым символом линии \n
, а затем я должен буду использовать эти разделители и извлечь номера после \n
. Каждый разделитель окружен квадратными скобками.
Теперь, как я могу это сделать в java с регулярным выражением?
То, что я до сих пор есть следующий код, который охватывает требования в указанной выше ссылке:
import java.util.ArrayList;
public class Calculator {
public String getDelimiter(String input) {
String delimiter = "";
String changeDelimiter = input.split("\\n")[0];
delimiter = changeDelimiter.substring(2);
return delimiter;
}
public int calculate(String input) {
String[] numbers;
if (input.contains("//")) {
String delimiter = getDelimiter(input);
System.out.println("aaaaaaaaaaaaaaaaaaaaaaa : " + delimiter); //testing the value
String calculation = input.split("\\n")[1];
numbers = calculation.split("[" + delimiter + "]+");
System.out.println("bbbbbbbbbbbbbbbbbbbbbbbb"); //testing the values
for (String number : numbers) {
System.out.print(number + ":");
// System.out.print(Integer.parseInt(number) + " ");
}
} else
numbers = input.split(",|\\n");
if (input.isEmpty()) {
return 0;
}
if (input.length() == 1) {
return Integer.parseInt(input);
}
else {
return getSum(numbers);
}
}
private int getSum(String[] numbers) throws IllegalArgumentException {
int sum = 0;
ArrayList<Integer> negatives = new ArrayList<Integer>();
for (int i = 0; i < numbers.length; i++) {
if (Integer.parseInt(numbers[i]) < 0) {
negatives.add(Integer.parseInt(numbers[i]));
}
if (Integer.parseInt(numbers[i]) >= 1000) {
continue;
} else
sum += Integer.parseInt(numbers[i]);
}
if (negatives.isEmpty()) {
return sum;
} else {
String negativeNumbers = "";
for (Integer number : negatives) {
negativeNumbers += number.toString() + " ";
}
throw new IllegalArgumentException("Negatives not allowed : " + negativeNumbers);
}
}
}
Должны ли мы рассмотреть, например. - числа с плавающей запятой или что-то вроде - '23' как одно целое число? Или вы просто хотите добавить отдельные цифры? –
Я суммирую только целые числа в этом упражнении. Да, 23 будет единственным целым числом. –
это может быть не java, но [страница regexp в MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) помогла мне в понимании этой темы – havarc