У меня есть входы вроде

AS23456SDE

MFD324FR

Мне нужно получить значения первого символа, например

AS, MFD

нельзя изменить ввод первых двух или первых трех символов . Перед числом необходимо указать первые символы .

Спасибо.

Изменить: это то, что я пробовал.

public static String getPrefix(String serial) {
    StringBuilder prefix = new StringBuilder();
        for(char c : serial.toCharArray()){
            if(Character.isDigit(c)){
                break;
            }
            else{
                prefix.append(c);
            }
        }
        return prefix.toString();
}
2
user2473015 6 Сен 2016 в 09:08

5 ответов

Лучший ответ

Я думаю, что это можно сделать с помощью простого регулярного выражения, которое соответствует цифрам и java функция разделения строк. Этот подход, основанный на регулярных выражениях, будет более эффективным, чем методы, использующие более сложные регулярные выражения.

Что-то вроде ниже будет работать

String inp = "ABC345.";
String beginningChars = inp.split("[\\d]+",2)[0];
System.out.println(beginningChars); // only if you want to print.

Регулярное выражение, которое я использовал "[\\d]+", уже экранировано для java.

Что он делает?

Соответствует одной или нескольким цифрам (d). d соответствует цифрам любого языка в Юникоде (поэтому он также соответствует японским и арабским числам)

Что делает String beginningChars = inp.split("[\\d]+",2)[0]?

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

Каков второй параметр для .split(regex,int), который я указал как 2?

Это параметр Limit. Это означает, что регулярное выражение будет применяться к строке, пока не будет найдено одно совпадение. После обнаружения 1 совпадения строка больше не обрабатывается.

На странице Javadoc Strings:

Параметр limit управляет количеством применений шаблона и, следовательно, влияет на длину результирующего массива. Если предел n больше нуля, то шаблон будет применен не более n - 1 раз, длина массива будет не больше n, а последняя запись массива будет содержать все входные данные, кроме последнего совпавшего разделителя. Если n не положительно, шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину. Если n равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а завершающие пустые строки будут отброшены.

Это будет эффективно, если ваша строка слишком большая.

Возможно другое регулярное выражение, если вы хотите разбить только на английские цифры

«[0-9] +»

1
faizan 6 Сен 2016 в 07:41
public static void main(String[] args) {
        String testString = "MFD324FR";
        int index = 0;
        for (Character i : testString.toCharArray()) {
            if (Character.isDigit(i))
                break;
            index++;
        }
        System.out.println(testString.substring(0, index));

}

Это печатает первые n символов до того, как встретит цифру (т.е. целое число).

1
Abhishek 6 Сен 2016 в 06:16

Используйте следующую функцию, чтобы получить требуемый вывод

public String getFirstChars(String str){
 int zeroAscii = '0'; int nineAscii = '9'; 
 String result = "";
 for (int i=0; i< str.lenght(); i++){
   int ascii = str.toCharArray()[i];
   if(ascii >= zeroAscii && ascii <= nineAscii){
     result = result + str.toCharArray()[i];
   }else{
     return result;
   }
 }
 return str;

}

Передайте вашу строку как аргумент

3
Sudeep Gujar 6 Сен 2016 в 06:34

Вот хорошее однострочное решение. Он использует регулярное выражение для сопоставления первых нечисловых символов в строке, а затем заменяет входную строку этим совпадением.

public String getFirstLetters(String input) {
    return new String("A" + input).replaceAll("^([^\\d]+)(.*)$", "$1")
                                  .substring(1);
}

System.out.println(getFirstLetters("AS23456SDE"));
System.out.println(getFirstLetters("1AS123"));

Вывод:

AS
(empty)
4
Tim Biegeleisen 6 Сен 2016 в 07:41

Простое решение может быть таким:

public static void main (String[]args) {

    String str = "MFD324FR";
    char[] characters = str.toCharArray();

    for(char c : characters){
        if(Character.isDigit(c))
            break;
        else
            System.out.print(c);
    }
}
3
ma3stro 6 Сен 2016 в 06:16