Java - 正则表达式标记

时间:2015-02-13 23:11:15

标签: java regex tokenize stringtokenizer

我试图标记以下格式的字符串:

"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();

2 个答案:

答案 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,则会中断。