字符串拆分

时间:2010-08-30 15:03:54

标签: java string

我有一个字符串,在java中的列表中放入$之间的最佳方法是什么?

String temp = $abc$and$xyz$;

如何将$ sign中的所有变量作为java中的列表获取 [abc,xyz]

我可以使用stringtokenizer但是如果可能的话想避免使用它。 THX

8 个答案:

答案 0 :(得分:9)

也许您可以考虑调用String.split(String regex) ...

答案 1 :(得分:4)

模式很简单,String.split应该在这里工作,但在更一般的情况下,StringTokenizer的一个替代方案是更强大java.util.Scanner

    String text = "$abc$and$xyz$";
    Scanner sc = new Scanner(text);

    while (sc.findInLine("\\$([^$]*)\\$") != null) {
        System.out.println(sc.match().group(1));
    } // abc, xyz

要找到的模式是:

\$([^$]*)\$
  \_____/     i.e. literal $, a sequence of anything but $ (captured in group 1)
     1                 and another literal $

[…]character class。像[aeiou]这样的东西匹配任何一个小写元音。 [^…]否定的字符类。 [^aeiou]除了小写元音之外的任何内容匹配。

(…)用于grouping(pattern)是一个捕获组,并创建一个反向引用。

$之前的反斜杠(在字符类定义之外)用于转义$,它具有end of line anchor的特殊含义。 {(1}}字面值中的反斜杠加倍:String"\\",长度为1,包含反斜杠。

这不是String的典型用法(通常设置分隔符模式,并使用Scanner提取标记),但它确实显示了如何使用next找到一个任意模式(忽略分隔符),然后使用findInLine访问MatchResult,从中可以获得个人group captures

您也可以直接在Pattern match()循环中使用此Matcher

find()

相关问题

答案 2 :(得分:1)

试试这个:temp.split("\\$");

答案 3 :(得分:1)

我会像Riduidel说的那样自己去找正则表达式。

然而,这种特殊情况非常简单,您只需将String视为字符序列,然后按char迭代它,并检测$符号。所以自己抓住琴弦。

在侧节点上,我会尝试使用不同的demarkation字符,以使其对 human 更具可读性。例如,使用$作为序列开始和其他东西作为序列结束。或者类似我认为Bash shell使用:${some_value}。如上所述,计算机并不关心,但你可以调试你的字符串:)

至于适当的正则表达式,像(\\$.*\\$)*左右这样的东西应该这样做。虽然我不是正则表达式的专家(请参阅http://www.regular-expressions.info了解有关正则表达式的详细信息)。

答案 4 :(得分:1)

基本上我认为Khotyn是最简单的解决方案。我看到你在答案中发帖说你不想在开始和结束时使用零长度令牌。

这提出了一个问题:如果字符串不以$开头和结尾会发生什么?这是一个错误,还是可选的?

如果是错误,那么就从:

开始
if (!text.startsWith("$") || !text.endsWith("$"))
  return "Missing $'s"; // or whatever you do on error

如果通过,则进入分裂。

如果$是可选的,我只是在拆分之前将它们剥离。即:

if (text.startsWith("$"))
  text=text.substring(1);
if (text.endsWith("$"))
  text=text.substring(0,text.length()-1);

然后进行拆分。

当然,您可以制作更复杂的正则表达式或使用StringTokenizer,或毫无疑问会提出其他许多复杂的解决方案。但为什么要这么麻烦?当有一个简单的解决方案时,请使用它。

PS还有一个问题是,如果连续两个$,你想要看到什么结果,例如: “$ foo的$$酒吧$”。应该给[“foo”,“bar”]或[“foo”,“”,“bar”]? Khotyn的分裂将给出第二个结果,零长度字符串。如果你想要第一个结果,你应该拆分(“\ $ +”)。

答案 5 :(得分:0)

如果您想要一个简单的拆分功能,请使用StringUtils.split {{1}}。 java一个使用正则表达式,这可能是过度/混乱。

答案 6 :(得分:0)

您可以通过简单的方式编写自己的代码。 只需使用以下代码,它就能为您完成工作

import java.util.ArrayList; import java.util.List;

public class MyStringTokenizer {

/**
 * @param args
 */
public static void main(String[] args) {

    List <String> result = getTokenizedStringsList("$abc$efg$hij$");

    for(String token : result)
    {
        System.out.println(token);
    }

}

private static List<String> getTokenizedStringsList(String string) {

    List <String> tokenList = new ArrayList <String> ();

    char [] in = string.toCharArray();

    StringBuilder myBuilder = null;
    int stringLength = in.length;
    int start = -1;
    int end = -1;
    {
        for(int i=0; i<stringLength;)
        {
            myBuilder = new StringBuilder();
            while(i<stringLength && in[i] != '$')
                i++;
            i++;
            while((i)<stringLength && in[i] != '$')
            {

                myBuilder.append(in[i]);
                i++;
            }
            tokenList.add(myBuilder.toString());                
        }
    }
    return tokenList;
}

}

答案 7 :(得分:0)

您可以使用

String temp = $abc$and$xyz$;
String array[]=temp.split(Pattern.quote("$"));
List<String> list=new ArrayList<String>();
for(int i=0;i<array.length;i++){
list.add(array[i]);
}

现在列表中有你想要的东西。