我有一个字符串,在java中的列表中放入$之间的最佳方法是什么?
String temp = $abc$and$xyz$;
如何将$ sign中的所有变量作为java中的列表获取 [abc,xyz]
我可以使用stringtokenizer但是如果可能的话想避免使用它。 THX
答案 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]);
}
现在列表中有你想要的东西。