поиск символа в строке

88
23 апреля 2021, 23:50

Имеется строка в которой может присутствовать любой один из пяти символов: & или @ или + или * или %

Например: In&Out, White@Black, 100+500 и так далее.

Как мне узнать, какой один из пяти возможных символов присутствует в ведённой строке, чтобы затем разбить эту строку на три подстроки и сохранить в переменных:

operand1 = до символа, operator = символ и operand2 = после символа

Пытался сделать так:

public static void main(String[] args) {
    String operand1;
    String operand2;
    String operator;
    char ch;
    String inputString = "White@Black";
    int lengthInputString;
    lengthInputString = inputString.length();
    for (int i = 0; i < lengthInputString; i++) {
        ch = inputString.charAt(i);
        if (ch == '&' || ch == '@' || ch == '+' || ch == '*'|| ch == '%') {
             operator = String.valueOf(ch)
        } 
    }
}

Получается очень некрасиво.

Answer 1

Если хочется красиво - тогда лучше сразу разбивать по регулярному выражению [@+&*%]:

public static void main(String[] args) {
    String str = "123&abcd";
    String[] pair = str.split("[@+&*%]");
    if (pair.length == 1)
        return;
    String delim = str.substring(pair[0].length(), str.length() - pair[1].length());
    System.out.println(pair[0]); // 123
    System.out.println(delim);   // &
    System.out.println(pair[1]); // abcd
}
Answer 2
class Example {
    private static final char[] DELIMITERS = { '&', '@', '+', '-', '/', '*', '%' };
    private static String extractDelimiter(String s) {
        for (char c : DELIMITERS) {
            if (s.indexOf(c) != -1)
                return String.valueOf(c);
        }
        return null;
    }
    public static void main(String[] args) {
        String operator = extractDelimiter("White@Black");
    }
}
Answer 3

Если вам нужен чистый код, то можно сделать так:

private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
public static void main(String[] args) {
    String input = "White@Black", operand1, operator, operand2;
    for (char c : DELIMITERS) {
        int index = input.indexOf(c);
        if(index != -1) {
            operand1 = input.substring(0, index);
            operator = String.valueOf(c);
            operand2 = input.substring(index + 1);
            break;
        }
    }
}

Хотя ваш вариант в целом неплох и намного быстрее с точки зрения производительности, чем предыдущий. А если его записать следующим образом, то выглядит довольно чисто, правда, кода больше.

private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
private static boolean isDelimeter(char c) {
    for (char delimiter : DELIMITERS)
        if(c == delimiter)
            return true;
    return false;
}
public static void main(String[] args) {
    String input = "White@Black", operand1, operator, operand2;
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (isDelimeter(c)) {
            operand1 = input.substring(0, i);
            operator = String.valueOf(c);
            operand2 = input.substring(i + 1);
            break;
        }
    }
}
Answer 4
 /**
 * Функция возвращает массив индексов искомого элемента в строке или -1, если таков не найден
 * 
 * @param pattern
 * @param text
 * @return
 */
public static int[] regExIndex(String pattern, String text, Integer fromIndex){
    Matcher matcher = Pattern.compile(pattern).matcher(text);
    if ( ( fromIndex != null && matcher.find(fromIndex) ) || matcher.find()) {
        return new int[]{matcher.start(), matcher.end()};
    }
    return new int[]{-1, -1};
}
public static void main(String[] args) {
    // группа разделителей в (), разделённых между собой |
    final String delimeters = "(&|@|\\+|\\*|%)";
    String sourceText = "abc%zxcv";
    String[] groups = new String[3];
    int[] result = regExIndex(delimeters, sourceText, 0);
    if ( result[0]>=0 ){
        groups[0] = sourceText.substring(0, result[0]);
        groups[1] = sourceText.substring(result[0], result[0]+1);
        groups[2] = sourceText.substring(result[0]+1);
        System.out.println(groups[0]);
        System.out.println(groups[1]);
        System.out.println(groups[2]);
    } else
        System.out.println("Nothing not found.");
}
READ ALSO
Какие типы изображений поддерживает iText?

Какие типы изображений поддерживает iText?

Я хочу добавить PNG-изображение в PDF-файл, но я знаю, что PDF не поддерживает PNG-файлыЗначит ли это, что я не могу использовать PNG-файлы в iText?

99
No IDEA annotations attached to the JDK

No IDEA annotations attached to the JDK

No IDEA annotations attached to the JDK 18 (D:\Program Files\Java\jdk1

97
Как самым простым способом передать объект из MongoDB в Angular?

Как самым простым способом передать объект из MongoDB в Angular?

В интернете просмотрел уже кучу всего и про Angular, и про NodeJS с Express, и про MongoDB, но вот как объединить их вместе без танцев с бубном не могу отыскатьЯ...

77
Обрезать число после второго знака после запятой

Обрезать число после второго знака после запятой

Нужно обрезать число поле второго знака после запятой, но в зависимосити от локали разделитель может быть разный

100