我喜欢用Java编写代码高尔夫(即使Java方式太冗长而不具竞争力),它正在以尽可能少的字节完成一定的挑战.在我的一个答案中,我有以下代码:
for(var p:"A4;B8;CU;EM;EW;E3;G6;G9;I1;L7;NZ;O0;R2;S5".split(";"))
Run Code Online (Sandbox Code Playgroud)
在我们将它转换为带有的字符串数组后,它基本上遍历2-char字符串.split.有人建议我可以把它打到这个而不是节省4个字节:
for(var p:"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G..)"))
Run Code Online (Sandbox Code Playgroud)
功能仍然相同.它循环遍历2个字符串.
但是,我们都没有100%确定这是如何工作的,因此这个问题.
我知道的:
我知道.split("(?<= ... )")用于拆分,但保留尾随分隔符.
还有一种方法可以将前导分隔符或分隔符保留为分隔项:
"a;b;c;d".split("(?<=;)") // Results in ["a;", "b;", "c;", "d"]
"a;b;c;d".split("(?=;)") // Results in ["a", ";b", ";c", ";d"]
"a;b;c;d".split("((?<=;)|(?=;))") // Results in ["a", ";", "b", ";", "c", ";", "d"]
Run Code Online (Sandbox Code Playgroud)
我知道\G用来在遇到不匹配后停止.
编辑:\G用于指示最后一个匹配结束的位置(或第一次运行的字符串的开头).修正了@SebastianProske的定义.
int count = 0;
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("match,");
java.util.regex.Matcher matcher = pattern.matcher("match,match,match,blabla,match,match,");
while(matcher.find())
count++;
System.out.println(count); // Results in 5
count = 0;
pattern = java.util.regex.Pattern.compile("\\Gmatch,");
matcher = …Run Code Online (Sandbox Code Playgroud)