如何从字符串中获取所有子字符串。JAVA

如何从字符串中获取所有子字符串。JAVA,java,android,Java,Android,我在从字符串获取子字符串时遇到问题。 我想从我的字符串中找到所有的子字符串F2*和K String str = "F2* *KF2*AT+BCAST:07,Max2*KF2*AT+JN*K"; Matcher m = Pattern.compile( Pattern.quote("F2*") + "(.*?)"

我在从字符串获取子字符串时遇到问题。 我想从我的字符串中找到所有的子字符串F2*和K

String str = "F2* *KF2*AT+BCAST:07,Max2*KF2*AT+JN*K";
            Matcher m = Pattern.compile(
                                        Pattern.quote("F2*")
                                        + "(.*?)"
                                        + Pattern.quote("*K")
                               ).matcher(str);
            while(m.find()){
                String match = m.group(1);
               Toast.makeText(this,  "Contains frame: " +match , Toast.LENGTH_LONG).show();

            }
我的期望是: ,AT+BCAST:07,Max2,AT+JN

它不起作用。 若它可以工作,下一步是从字符串中删除所有帧F2*…*K。 我想通过以下方式做到这一点:

 str.replaceFirst(temp1, "");
其中,temp1 contanis F2*+匹配+*K

这是正确的吗

提前感谢,

@梅利赫·阿尔塔,谢谢你的回答


它在我的android应用程序中不起作用。find始终为false,如果没有它,java报告将不会成功匹配

导入java.util.regex.Matcher; 导入java.util.regex.Pattern

MainString  = "F2* *KF2*AT+BCAST:07,Max2*KF2*AT+JN*K";
    Toast.makeText(this,  MainString , Toast.LENGTH_LONG).show();
    try{
     if(    (MainString.contains("F2*"))&&(MainString.contains("*K"))  )
     { 
            Pattern pattern = Pattern.compile("(?<=F2\\*).*?(?=\\*K)");
            Matcher matcher = pattern.matcher(MainString);
            Toast.makeText(this,  "contains frame" + matcher.group(1), Toast.LENGTH_LONG).show(); // this only for cheking error - > java reports no successful match

            while (matcher.find()) {            
                Toast.makeText(this,  "zawiera ramke: " , Toast.LENGTH_LONG).show();
                System.out.println(matcher.group());

            }

     }
    }catch(Exception e){
           Toast.makeText(this, e.toString() , Toast.LENGTH_LONG).show();

    }

也许您可以使用java.lang.StringindexOfString str,int fromIndex搜索帧,然后从找到K的位置开始搜索。要在F2*和*K==>

    String str = "F2* *KF2*AT+BCAST:07,Max2*KF2*AT+JN*K";
    Pattern pattern = Pattern.compile("(?<=F2\\*).*?(?=\\*K)");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {            
        System.out.println(matcher.group());
    }
如果只想从字符串中删除==>

str = str.replaceAll("(?<=F2\\*).*?(?=\\*K)", "");
System.out.println(str);

如果F2*和*K始终是您要查找的术语,那么如果不适合您,则无需使用正则表达式。您可以使用indexof来完成此操作,只需重复此过程。我假设开始键总是在结束键之前,并且在这个过程中要提取的普通文本不会复制这些键

private static final String START_KEY = "F2*";
private static final String END_KEY = "*K";
List<String> substrings = new ArrayList<String>();

private void processString(String s){
    if(s.indexof(START_KEY) == -1){
        return;
    }

    //Offset target string by number of char in START_KEY
    substrings.add(s.substr(s.indexof(START_KEY) + 3, s.indexOf(END_KEY)));

    //Recursive call on left over char if any exist
    try{
        processString(s.substr(endKey + 2);  
    } catch (IndexOutOfBoundsException e) {
        //ignore - if no string left call should end
    }
}   

尝试使用group2,我不认为regex是0 basedIt在我的android应用程序中不起作用。find总是false,如果没有它,java报告将不会成功匹配。只有当字符串中只有一个K时,这才有效。如果有2K的索引,这不是一个好主意。为什么?通过indexOfF2,0和indexOfK,0搜索第一帧,然后在后续搜索中,将0替换为找到的最后一个K的位置-以便每个新搜索在找到最后一个K后开始。仅搜索K不处理起始标记。就这样结束了。如果您同时查找这两个,并在切掉找到的字符串后继续查找,则索引会起作用。这根本不是真的,您可以为indexOf提供一个开始索引,以便搜索应该在哪个位置开始,这样您就不必切掉字符串。我明白您的意思。你找K,把前面的代入到F2*的末尾,然后从K的末尾继续。我不知道你可以在一个特定的点后进行索引。好的,我不知道。这是我在stackoverflow的第一个等式。
F2**KF2**KF2**K
private static final String START_KEY = "F2*";
private static final String END_KEY = "*K";
List<String> substrings = new ArrayList<String>();

private void processString(String s){
    if(s.indexof(START_KEY) == -1){
        return;
    }

    //Offset target string by number of char in START_KEY
    substrings.add(s.substr(s.indexof(START_KEY) + 3, s.indexOf(END_KEY)));

    //Recursive call on left over char if any exist
    try{
        processString(s.substr(endKey + 2);  
    } catch (IndexOutOfBoundsException e) {
        //ignore - if no string left call should end
    }
}