如何在第二个点Java之后找到第一个字符

时间:2018-08-24 11:07:43

标签: java regex string java-8

您有任何想法如何在字符串的 second 点之后获得第一个字符。

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

在第一种情况下,我应该得到a,在第二种情况下,我应该得到2。 我考虑过用点将字符串分隔,并提取第三个元素的第一个字符。但这似乎很复杂,我认为有更好的方法。

7 个答案:

答案 0 :(得分:10)

正则表达式如何?

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

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

正则表达式说:以非贪婪的方式(.+?)查找一次或多次,必须跟一个点(\\.),然后再查找一次或多次。非贪婪的方式(.+?),后跟点(\\.)。匹配后,取第一组((\\w))中的第一个单词字符。

答案 1 :(得分:2)

在不使用模式的情况下,可以使用String类的subStringcharAt方法来实现此目的

// 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 '-';
}

答案 2 :(得分:2)

通常,正则表达式将在这里做得很好。仍然,如果您正在寻找更可定制的东西,请考虑以下实现:

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)); -> //打印10
System.out.println(positionOf(str1,“ c”,4)); -> //打印21
System.out.println(positionOf(str1,“ c”,5)); -> //打印-1
System.out.println(positionOf(str1,“ ..”,2)); -> //打印22->请记住,匹配后的第一个符号位于22 + target.length()的位置,并且在char数组中也可能没有具有该索引的元素。

答案 3 :(得分:1)

您可以这样拆分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注释)。

答案 4 :(得分:1)

您可以从Java 8开始使用Java Stream API:

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));
    }
}

此代码在每行上打印两个结果:a2和一个空通道,因为在第三个字符串上没有匹配项。

答案 5 :(得分:0)

使用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)只需要检查所有字符。

第二个版本使用indexOfOptional实现相同的逻辑:

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);
}

答案 6 :(得分:-1)

这是另一种方法,不是单行代码,而是简单的方法。

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 ++;   
                }
            }
        }
    }
}

找到字符:a
找到字符:2