有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么StringTokenizer在$$as delimeter中不能正常工作

我使用StringTokenizer来标记一个字符串,其中$$作为delimeter,但是如果我的字符串类似于$1$dga74,那么它会从第一个$开始标记它。有谁能告诉我为什么会发生这种情况,我能做些什么来消除这个问题

String str="/getCPage.asp?m=total&sub=$1$dga74$$/getEpage.asp?m=tatal&sub=0";
StringTokenizer tok=new StringTokenizer(str,"$$")
String url1=tok.nextToken();
String url2=tok.nextToken();

共 (2) 个答案

  1. # 1 楼答案

    delim参数中的每个字符都被视为分隔符字符。如果指定"$$",则指定$两次(忽略第二次)

    要解决您的问题,您可以使用Scanner

    public static void main(String[] args) {
    
        String s = "/getCPage.asp?m=total&sub=$1$dga74$$/getEpage.asp?m=tatal&sub=0";
    
        Scanner scanner = new Scanner(s);
        scanner.useDelimiter("\\$\\$");
    
        System.out.println(scanner.next());
        System.out.println(scanner.next());
    }
    

    产出:

    /getCPage.asp?m=total&sub=$1$dga74
    /getEpage.asp?m=tatal&sub=0
    
  2. # 2 楼答案

    StringTokenizer仅适用于单字符标记

    您可以使用^{}和一个简单的循环来实现所需的结果:

    List<String> res = new ArrayList<String>();
    Pattern p = Pattern.compile("([$]{1,2}|=>?| +)");
    String s = "$1$dga74$$";
    Matcher m = p.matcher(s);
    int pos = 0;
    while (m.find()) {
        if (pos != m.start()) {
            res.add(s.substring(pos, m.start()));
        }
        res.add(m.group());
        pos = m.end();
    }
    if (pos != s.length()) {
        res.add(s.substring(pos));
    }
    for (String t : res) {
        System.out.println("'"+t+"'");
    }