在Java字符串中查找标记

时间:2009-06-19 05:20:02

标签: java string

有没有一种很好的方法来提取以预定义字符串开头并以预定义字符串结尾的标记?

例如,假设起始字符串为“[”,结束字符串为“]”。如果我有以下字符串:

“你好[世界]这里[[是]我”

输出应为:

token [0] =“世界”

token [1] =“[is”

(注意:第二个令牌中有一个'start'字符串)

8 个答案:

答案 0 :(得分:8)

我认为您可以使用Apache Commons Lang中存在的StringUtils功能:

substringsBetween(java.lang.String str,
                  java.lang.String open,
                  java.lang.String close)

API文档说:

  

在字符串中搜索子字符串   由开始和结束标记分隔,   返回所有匹配的子串   一个数组。

API之间的Commons Lang子串可以在这里找到:

http://commons.apache.org/lang/apidocs/org/apache/commons/lang/StringUtils.html#substringsBetween(java.lang.String,%20java.lang.String,%20java.lang.String)

答案 1 :(得分:1)

这是我避免依赖公共场所的方式。

public static String escapeRegexp(String regexp){
    String specChars = "\\$.*+?|()[]{}^";
    String result = regexp;
    for (int i=0;i<specChars.length();i++){
        Character curChar = specChars.charAt(i);
        result = result.replaceAll(
            "\\"+curChar,
            "\\\\" + (i<2?"\\":"") + curChar); // \ and $ must have special treatment
    }
    return result;
}

public static List<String> findGroup(String content, String pattern, int group) {
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(content);
    List<String> result = new ArrayList<String>();
    while (m.find()) {
        result.add(m.group(group));
    }
    return result;
}


public static List<String> tokenize(String content, String firstToken, String lastToken){
    String regexp = lastToken.length()>1
                    ?escapeRegexp(firstToken) + "(.*?)"+ escapeRegexp(lastToken)
                    :escapeRegexp(firstToken) + "([^"+lastToken+"]*)"+ escapeRegexp(lastToken);
    return findGroup(content, regexp, 1);
}        

像这样使用:

String content = "hello[world]this[[is]me";
List<String> tokens = tokenize(content,"[","]");

答案 2 :(得分:0)

StringTokenizer?将搜索字符串设置为“[]”,并将“包含标记”标记设置为false,我认为您已设置。

答案 3 :(得分:0)

普通字符串标记符不能满足他的要求,但你必须调整它或自己编写。

答案 4 :(得分:0)

有一种方法可以做到这一点。它不是特别漂亮。它涉及的是逐个字符串。当您到达“[”时,您开始将字符放入新标记中。当你到达“]”时,你就会停下来。这最好使用数据结构而不是数组,因为数组是静态长度。

另一种可能的解决方案是将正则表达式用于String的split split方法。我唯一的问题是提出一个正则表达式,它会分裂你想要的方式。我能想到的是{]字符串[] XOR(字符串[] XOR(]字符串)每组括号表示不同的正则表达式。您应该按此顺序对它们进行评估,这样您就不会意外删除任何想要的内容。我不熟悉Java中的正则表达式,因此我使用“字符串”来表示括号之间有字符。

答案 5 :(得分:0)

尝试使用正则表达式:

(.*?\[(.*?)\])

第二次捕获应该包含[]集之间的所有信息。但是,如果字符串包含嵌套的[]。

,则无法正常工作

答案 6 :(得分:0)

StringTokenizer不会针对指定的行为剪切它。你需要自己的方法。类似的东西:

public List extractTokens(String txt, String str, String end) {
    int                      so=0,eo;
    List                     lst=new ArrayList();

    while(so<txt.length() && (so=txt.indexOf(str,so))!=-1) {
        so+=str.length();
        if(so<txt.length() && (eo=txt.indexOf(end,so))!=-1) {
            lst.add(txt.substring(so,eo);
            so=eo+end.length();
            }
        }
    return lst;
    }

答案 7 :(得分:0)

正则表达式\\[[\\[\\w]+\\]给了我们 [世界]和 [[是]