Как найти первый символ после второй точки Java - PullRequest
0 голосов
/ 24 августа 2018

Есть ли у вас какие-либо идеи, как получить первый символ после второй точки строки.

String str1 = "test.1231.asdasd.cccc.2.a.2";
String str2 = "aaa.1.22224.sadsada";

В первом случае я должен получить a, а во втором 2.Я думал о делении строки с точкой и извлечении первого символа третьего элемента.Но это кажется сложным, и я думаю, что есть лучший способ.

Ответы [ 7 ]

0 голосов
/ 24 августа 2018

Обычно регулярное выражение делает отличную работу здесь.Тем не менее, если вы ищете что-то более настраиваемое, рассмотрите следующую реализацию:

private static int positionOf(String source, String target, int match) {
    if (match < 1) {
        return -1;
    }
    int result = -1;

    do {
        result = source.indexOf(target, result + target.length());
    } while (--match > 0 && result > 0);

    return result;
}

, а затем тест будет выполнен с:

String str1 = "test..1231.asdasd.cccc..2.a.2 ".System.out.println (positionOf (str1, ".", 3));-> // печатает 10System.out.println (positionOf (str1, "c", 4));-> // печатает 21System.out.println (positionOf (str1, "c", 5));-> // печатает -1System.out.println (positionOf (str1, "..", 2));-> // печатает 22 -> просто имейте в виду, что первый символ после совпадения находится в позиции 22 + target.length (), а также может отсутствовать элемент с таким индексом в массиве char.

0 голосов
/ 24 августа 2018

Просто другой подход, не однострочный, а простой.

public class Test{
    public static void main (String[] args){
        for(String str:new String[]{"test.1231.asdasd.cccc.2.a.2","aaa.1.22224.sadsada"}){
            int n = 0;
            for(char c : str.toCharArray()){
                if(2 == n){
                    System.out.printf("found char: %c%n",c);
                    break;
                }
                if('.' == c){
                    n ++;   
                }
            }
        }
    }
}

found char: aнайдено чар: 2

0 голосов
/ 24 августа 2018

Вы можете использовать Java Stream API начиная с Java 8:

String string = "test.1231.asdasd.cccc.2.a.2";
Arrays.stream(string.split("\\."))                 // Split by dot
      .skip(2).limit(1)                            // Skip 2 initial parts and limit to one
      .map(i -> i.substring(0, 1))                 // Map to the first character
      .findFirst().ifPresent(System.out::println); // Get first and print if exists

Однако я рекомендую вам придерживаться Regex, что является более безопасным и правильным способом сделать это:


Вот необходимое вам регулярное выражение (демонстрация доступна по адресу Regex101 ):

.*?\..*?\.(.).*

Не забудьте экранировать специальные символы двойным слешем \\.

String[] array = new String[3];
array[0] = "test.1231.asdasd.cccc.2.a.2";
array[1] = "aaa.1.22224.sadsada";
array[2] = "test";

Pattern p = Pattern.compile(".*?\\..*?\\.(.).*");
for (int i=0; i<array.length; i++) {
    Matcher m = p.matcher(array[i]);
    if (m.find()) {
         System.out.println(m.group(1));
    }
}

Этот код печатает два результата в каждой строке: a, 2 и пустую строку, потому что в 3-й строке нет совпадений.

0 голосов
/ 24 августа 2018

Простое решение с использованием String.indexOf:

public static Character getCharAfterSecondDot(String s) {
    int indexOfFirstDot = s.indexOf('.');
    if (!isValidIndex(indexOfFirstDot, s)) {
        return null;
    }

    int indexOfSecondDot = s.indexOf('.', indexOfFirstDot + 1);
    return isValidIndex(indexOfSecondDot, s) ?
            s.charAt(indexOfSecondDot + 1) :
            null;
}

protected static boolean isValidIndex(int index, String s) {
    return index != -1 && index < s.length() - 1;
}

Использование indexOf(int ch) и indexOf(int ch, int fromIndex) требует только проверки всех символов в худшем случае.

И вторая версия, реализующаята же логика, используя indexOf с Optional:

public static Character getCharAfterSecondDot(String s) {
    return Optional.of(s.indexOf('.'))
            .filter(i -> isValidIndex(i, s))
            .map(i -> s.indexOf('.', i + 1))
            .filter(i -> isValidIndex(i, s))
            .map(i -> s.charAt(i + 1))
            .orElse(null);
}
0 голосов
/ 24 августа 2018

Вы можете сделать это, разделив String следующим образом:

public static void main(String[] args) {
    String str1 = "test.1231.asdasd.cccc.2.a.2";
    String str2 = "aaa.1.22224.sadsada";

    System.out.println(getCharAfterSecondDot(str1));
    System.out.println(getCharAfterSecondDot(str2));
}

public static char getCharAfterSecondDot(String s) {
    String[] split = s.split("\\.");
    // TODO check if there are values in the array!
    return split[2].charAt(0);
}

Я не думаю, что это слишком сложно, но использование подходящего регулярного выражения - очень хорошее (возможно, лучшее) решение.в любом случае.

Обратите внимание, что может быть случай ввода String с менее чем двумя точками, который должен быть обработан (см. TODO комментарий в коде).

0 голосов
/ 24 августа 2018

Не используя шаблон, вы можете использовать subString и charAt метод класса String для достижения этого

// You can return String instead of char
public static char returnSecondChar(String strParam) {
    String tmpSubString = "";
   // First check if . exists in the string.
    if (strParam.indexOf('.') != -1) {
        // If yes, then extract substring starting from .+1  
        tmpSubString = strParam.substring(strParam.indexOf('.') + 1);
        System.out.println(tmpSubString);

       // Check if second '.' exists
        if (tmpSubString.indexOf('.') != -1) {

            // If it exists, get the char at index of . + 1  
            return tmpSubString.charAt(tmpSubString.indexOf('.') + 1);
        }
    }
    // If 2 '.' don't exists in the string, return '-'. Here you can return any thing
    return '-';
}
0 голосов
/ 24 августа 2018

Как насчет регулярного выражения для этого?

Pattern p = Pattern.compile(".+?\\..+?\\.(\\w)");
Matcher m = p.matcher(str1);

if (m.find()) {
     System.out.println(m.group(1));
}

Регулярное выражение говорит: найдите что-нибудь один или несколько раз не жадным образом (.+?), за которым должна следовать точка (\\.), затем снова что-нибудь один или несколько раз не жадным образом (.+?), за которым следует точка (\\.).После этого возьмите первый символ слова в первой группе ((\\w)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...