输入是类似 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 搞了半天 没弄出来
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 搞了半天 没弄出来
如果是那样,可能要分几步走。
先递归取出[]包含的node,将它替换
再根据\和\\split
再将node替换回去
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);
}
}
Pattern p = Pattern.compile("[a-zA-Z]+(\\[.*\\])?");
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]
但是结果开把[[]] 里的还是拆开了 是我正则表达式写错了?
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);
}
}