0

我正在尝试使用正则表达式将字符串拆分为字段,但不幸的是它不能 100% 工作并且正在跳过一些应该拆分的部分。这是程序处理字符串的一部分:

void parser(String s) {
    String REG1 = "(',\\d)|(',')|(\\d,')|(\\d,\\d)";
    Pattern p1 = Pattern.compile(REG1);
    Matcher m1 = p1.matcher(s);
while (m1.find() ) {

            System.out.println(counter + ":  "+s.substring(end, m1.end()-1)+" "+end+   "  "+m1.end());
            end =m1.end();
        counter++;
    }
}

字符串是:

s= 3101,'12HQ18U0109','11YX27X0041','XX21','SHV7-P Hig, Hig','','GW1','MON','E','A','ASEXPORT-1',1,101,0,'0','1500','V','','',0,'mb-master1'

问题是它不会分裂,1,,0,

解析规则是: 字符串被包围 ,' ',例如,'ASEXPORT-1', int仅被包围, ,

预期产出 =

3101   |   12HQ18U0109  |  11YX27X0041  | XX21    |  SHV7-P Hig, Hig|  |GW1   |MON  |E  |  A|   ASEXPORT-1|  1  |101   |0   |  0  |1500  |   V|    |   |   0   |mb-master1

共有 21 个元素。

4

2 回答 2

4

你可以用这个正则表达式拆分它

,(?=([^']*'[^']*')*[^']*$)

只有在前面,有偶数个时才会分裂'


因此对于

3101,'12HQ18,U0109','11YX27X0041'

输出将是

3101
'12HQ18,U0109'
'11YX27X0041'

笔记

它不适用于像'hello 'h,i'world'.. 这样的嵌套字符串。如果有任何此类情况,您应该使用以下正则表达式

(?<='),(?=')|(?<=\d),(?=\d|')|(?<=\d|'),(?=\d)
于 2013-05-23T07:42:31.420 回答
0

如果您还(出于某种奇怪的原因)需要知道原始字符串中的每个匹配开始和结束索引(就像您在示例输出中拥有它一样),您可以使用以下模式:

String regex = "('[^']*'|\\d+)";

这将匹配一个不带引号的整数或单引号的字符串。您可以选择在匹配的子字符串上使用“第二遍”
删除前导和尾随:'

match = match.replaceAll("\\A'|'\\Z", "");

它将前导和尾随替换为空'

代码可能如下所示:

Pattern pat = Pattern.compile("('[^']*'|\\d+)");
Matcher m = pat.matcher(str);

int counter = 0, start = 0;
while (m.find()) {
    String match = m.group(1);
    int end = start + match.length();
    match = match.replaceAll("\\A'|'\\Z", "");   // <-- comment out for NOT replacing 
                                                 //     leading and trailing quotes 
    System.out.format("%d: %s [%d - %d]%n", ++counter, match, start, end);
    start = end + 1;   // <-- the "+1" is to account for the ',' separator
}

另请参阅这个简短的演示

于 2013-05-23T08:21:28.117 回答