输入是类似 Xpath  String input1 = "\doc\\paper\\a\c[g\\a[d]\\h]\\d\\output"
                  String input2 = "\doc\\a[paper\\f]\\paper\\e\f\\output"
类似input1 input2都是以相同的\doc 开头 以\output结尾 有两种边 "\" 和"\\"
和特征表示符号"[]" (在[] 之间的内容属于前一个node 例如 \c[g\\a\\h]\ 中 [g\\a\\h]属于node c)
将 input断开成 node如 input1 变成 String[]或者list成员 doc paper a c[...] d output 应该怎样做 我用正则表达式和split 搞了半天 没弄出来  

解决方案 »

  1.   

    你看看 把\c[g\\a[d]\\h] 先截取出来 再放回去可以吗  好像不太好  等答案
      

  2.   

    []有没有可能多层嵌套下去?
    如果是那样,可能要分几步走。
    先递归取出[]包含的node,将它替换
    再根据\和\\split
    再将node替换回去
      

  3.   

    for example
    public class Test {
        public static void main(String[] args) {
            String input1 = "\\doc\\\\paper\\\\a\\c[g\\\\a[d]\\\\h]\\\\d\\\\output";
            System.out.println(input1);        List<String> list = new ArrayList<String>();
            Pattern p = Pattern.compile("[a-zA-Z]+\\[.*\\]|[a-zA-Z]+");
            Matcher m = p.matcher(input1);
            while (m.find()) {
                //System.out.println(m.group());
                list.add(m.group());
            }
            System.out.println(list);
        }
    }
      

  4.   

    这样可能更好一些
    Pattern p = Pattern.compile("[a-zA-Z]+(\\[.*\\])?");
      

  5.   

    谢谢你的答案 我自己试了 一下 用的正斜杠 
     String input2 = "/doc//paper//paper//a[/s//d//ss[dd]]//b/c[/a//asd[aa]/sd]//output";
            System.out.println(input2);
                 List<String> list = new ArrayList<String>();
     Pattern p = Pattern.compile("[a-zA-Z]+(//[.*//])?");
            Matcher m = p.matcher(input2);
            while (m.find()) {
    //             System.out.println(m.group());
                list.add(m.group());
            }
            System.out.println(list);结果:/doc//paper//paper//a[/s//d//ss[dd]]//b/c[/a//asd[aa]/sd]//output
    [doc, paper, paper, a, s, d, ss, dd, b, c, a, asd, aa, sd, output]
    但是结果开把[[]] 里的还是拆开了 是我正则表达式写错了?
      

  6.   

    这样如果出现多次[] 如 c[/c]/a/d[/d] 不能拆成c[]  a  d[]  而是拆成一个了 
      

  7.   

    无解!Java 正则表达式不支持层数未知的嵌套
      

  8.   

    只能说:正则是死的,人是活的public static void main(String[] args) {
    String str = "/doc//paper//paper//a[/s//d//ss[dd]]//b/c[/a//asd[aa]/sd]//output";
    //String str = "/doc//a[paper//f]//paper//e/f//output";

         char[] ch = str.toCharArray();
    int left = 0; //左括号数量
    LinkedList<Integer> lLeft = new LinkedList<Integer>(); //记录左中括号的位置
    for(int i = 0; i < str.length(); i++){
    if(ch[i] == '['){
    left++;
    lLeft.addFirst(i);
    }
    if(ch[i] == ']'){
    if(left == 1){
    ch[i] ='2'; //将最外层的右中括号设置为'2'
    ch[lLeft.getFirst()] = '1'; //将最左边的中括号设置为'1'
    left = 0;
    }else{
    left--;
    lLeft.removeFirst();
    }
    }
    }
    String str2 = new String(ch);
    System.out.println(str2); //输出转化后的字符串
    //System.out.println("----------");
    Pattern p = Pattern.compile("(?<=/{1,2})[a-zA-Z]+(1.*?2)*[a-zA-Z]*(?=/{1,2})");
    Matcher m = p.matcher(str2);
    List<String> result = new ArrayList<String>();
    String tmp = null;
    while(m.find()){
    tmp = m.group();
    tmp = tmp.replace('1', '[');
    tmp = tmp.replace('2', ']');
    result.add(tmp);
    }
    System.out.println("---");
    for(String s : result){
    System.out.println(s);
    }
    }
      

  9.   

    谢谢你的答案 嗯 正想用[ 符号压入Stack来做 这样先读取[ 和] 数目 然后替换的不如在刚开始便将[]之间的/ 替换掉 比如* 然后split(‘/’)断开 在把*替换回来的直接? 
      

  10.   

    Pattern p = Pattern.compile("(?<=/{1,2})[a-zA-Z]+(1.*?2)*[a-zA-Z]*(?=/{1,2})");能解释一下这个正则式吗    /是出现最少1次最多2次 [a-zA-Z]是任意字母  前面?<= 的意思是?