java:string的正则表达式
我试图使用正则表达式将字符串拆分为字段,但不幸的是,它不能100%工作,并且跳过了应该拆分的部分。以下是程序处理字符串的一部分: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
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”
)