如何从字符串中获取标记之间的所有子字符串。 JAVA

时间:2014-02-11 22:28:46

标签: java android

我遇到了从字符串中创建子字符串的问题。 我想从我的字符串中找到所有子串beetwen标记“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

这是对的吗?

提前致谢,

@MelihAltıntaş,谢谢你的回答。

它在我的Android应用程序中不起作用。 Matcher.find()总是假的,没有成功匹配的java报告。

import java.util.regex.Matcher; import 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();

    }

3 个答案:

答案 0 :(得分:0)

也许您可以使用java.lang.String#indexOf(String str, int fromIndex)搜索框架,然后从找到&#34; K&#34;的位置开始。

答案 1 :(得分:0)

在F2 *和* k ==&gt;

之间找到
    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());
    }

输出:

1 
2 AT+BCAST:07,Max2
3 AT+JN

如果您只想从字符串中删除==&gt;

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

输出:

F2**KF2**KF2**K

答案 2 :(得分:0)

如果F2 *和* K始终是您要查找的术语,则无需使用正则表达式,如果这对您不起作用。您可以使用indexof执行此操作,您只需重复此过程即可。我认为START_KEY始终位于END_KEY之前,并且这些不会被您要在此过程中提取的普通文本重复。

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