Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:string的正则表达式_Java_Regex_String Split - Fatal编程技术网

java:string的正则表达式

java:string的正则表达式,java,regex,string-split,Java,Regex,String Split,我试图使用正则表达式将字符串拆分为字段,但不幸的是,它不能100%工作,并且跳过了应该拆分的部分。以下是程序处理字符串的一部分: void parser(String s) { String REG1 = "(',\\d)|(',')|(\\d,')|(\\d,\\d)"; Pattern p1 = Pattern.compile(REG1); Matcher m1 = p1.matcher(s); while (m1.find() ) { Sy

我试图使用正则表达式将字符串拆分为字段,但不幸的是,它不能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个元素。

您可以使用此正则表达式拆分它

,(?=([^']*'[^']*')*[^']*$)
只有当前面有偶数个
时,它才会在
处分裂


所以

3101,'12HQ18,U0109','11YX27X0041'
产出将是

3101
'12HQ18,U0109'
'11YX27X0041'

注意

它不适用于嵌套字符串,如
'hello'h,i'world'

(?<='),(?=')|(?<=\d),(?=\d|')|(?<=\d|'),(?=\d)

(?您可以使用此正则表达式拆分它

,(?=([^']*'[^']*')*[^']*$)
只有当前面有偶数个
时,它才会在
处分裂


所以

3101,'12HQ18,U0109','11YX27X0041'
产出将是

3101
'12HQ18,U0109'
'11YX27X0041'

注意

它不适用于嵌套字符串,如
'hello'h,i'world'

(?<='),(?=')|(?<=\d),(?=\d|')|(?<=\d|'),(?=\d)
(?如果您(出于某些奇怪的原因)还需要知道原始字符串中的每个匹配开始和结束索引(就像您在示例输出中所做的那样),则可以使用以下模式:

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
}
Pattern pat=Pattern.compile(“('[^']*'\\\d+”);
匹配器m=匹配器(str);
int计数器=0,开始=0;
while(m.find()){
字符串匹配=m.group(1);
int end=start+match.length();
match=match.replaceAll(“\\A'|'\\Z',”);/如果您还(出于某些奇怪的原因)需要知道原始字符串中的每个匹配开始和结束索引(就像您在示例输出中所做的那样),则可以使用以下模式:

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
}
Pattern pat=Pattern.compile(“('[^']*'\\\d+”);
匹配器m=匹配器(str);
int计数器=0,开始=0;
while(m.find()){
字符串匹配=m.group(1);
int end=start+match.length();

match=match.replaceAll(\\A'.'\\Z',“”);//为什么不先
String.split(',')
,然后查看拆分是否用“'”括起来?字符串是否可以包含逗号?(例如“str,ing”),我想您可以用“,”拆分while字符串然后,用单引号括起来的元素将是字符串,没有单引号的元素将是int。您应该指定预期的输出字符串是否包含转义的
'
?(例如
'SHV7'02'
)为什么不先
字符串。拆分(',')
,然后查看拆分是否用“.”括起来是否?字符串是否可以包含逗号?(例如,“str,ing”)我认为您可以将while字符串拆分为“,”然后用单引号括起来的元素将是字符串,没有单引号的元素将是int。您应该指定预期的输出字符串是否可以包含转义的
?(例如
“SHV7'02”