我试图标记以下格式的字符串:
"98, BA71V-CP204L (p32, p30), BA71V-CP204L (p32, p30), , 0, 125900, 126505"
"91, BA71V-B175L, BA71V-B175L, , 0, 108467, 108994, -, 528, 528"
然后将每个标记存储在字符串数组中。字符串将被“,”排除,但不包括(,)内的那些字符串,以便(,)的内容属于一个标记。令牌也可能只包含一个空格。
我认为reg-ex会找到一个逗号,然后检查它是否被左括号括起来,右边是一个右括号。由于这个逗号包含some(),因此不会用于标记化。
我可以有相反的正则表达式,但是分隔符的任何一边都包含“(”或“)”的时间呢?
目前正在使用:
StringTokenizer tokaniza = new StringTokenizer(content,","); //no regex
但我觉得正则表达式更好用
content.split();
答案 0 :(得分:2)
使用否定先行断言。
String s = "98, BA71V-CP204L (p32, p30), BA71V-CP204L (p32, p30), , 0, 125900, 126505";
String parts[] = s.split(",(?![^()]*\\))");
System.out.println(Arrays.toString(parts));
输出:
[98, BA71V-CP204L (p32, p30), BA71V-CP204L (p32, p30), , 0, 125900, 126505]
答案 1 :(得分:1)
使用以下方法尝试拆分:
(?<!\(\w{1,4}),(?!\s*\w*\)).*?
唯一的事情是,Java不支持在后视镜中无限重复,你必须指定括号内的字符数(即\ w {1,4})。换句话说,如果括号内的字符超过4,则会中断。