2009-06-19 56 views
1

是否有一种很好的方法来提取以预定义字符串开头并以预定义字符串结尾的标记?在Java字符串中查找标记

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

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

输出应该是:

令牌[0] = “世界”

令牌[ 1] =“[是”

(注:所述第二令牌具有“启动”的字符串中的话)

+0

是你的令牌一个字符只有或可能会更长? – glmxndr 2009-06-19 05:34:24

+0

可能会更长 - 我的例子是为了简单起见,但起始字符串可能是“富”,结束字符串可能是“酒吧”。 – digiarnie 2009-06-19 05:37:48

+0

看起来像Apache Commons Lang - StringUtils.substringsBetween(string,open,close)是你需要的。按照上述要求工作,请参阅下面的答案了解更多详情。 – Jon 2009-06-19 06:08:14

回答

5

我想你可以使用Apache Commons Lang功能存在于:

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

API文档说:

搜索通过分隔子 一个String开始和结束标记 返回 中的所有匹配子串。

下议院郎substringsBetween API可以在这里找到:

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

0

StringTokenizer设置搜索字符串?“[]”和“包括令牌”标志false我觉得你已经定了。

+0

对不起,这是哪种方法?我在签名 – digiarnie 2009-06-19 05:30:53

0

正常字符串tokenizer不会为他的要求工作,但你必须调整它或写你自己的。

0

有一种方法可以做到这一点。这不是特别漂亮。它涉及的是逐字符串处理字符串。当你到达“[”时,你开始把角色放入一个新的令牌中。当你到达“]”时,你停下来。由于数组的长度是静态的,因此最好使用不是数组的数据结构。

另一种可能的解决方案是对字符串的拆分方法使用正则表达式。我遇到的唯一问题是提出一个正则表达式,它会按照你想要的方式分割。我能想出的是{]字符串[)异或(字符串[)异或(]字符串)每一组圆括号表示不同的正则表达式。你应该按照这个顺序对它们进行评估,以免你不小心删除任何你想要的东西。我不熟悉Java中的正则表达式,因此我使用“字符串”来表示括号中有字符。

0

尝试一个正则表达式,如:

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

第二捕获应该包含所有的组[]之间的信息。但是,如果字符串包含嵌套的[],这将无法正常工作。

1

以下是我将避免依赖commons lang的方式。

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,"[","]"); 
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; 
    } 
0

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