Java 为什么String.split的行为是这样的?
我的代码是Java 为什么String.split的行为是这样的?,java,regex,string,Java,Regex,String,我的代码是 public class Main { public static void main(String[] args) { String inputString = "#..#...##"; String[] abc = inputString.trim().split("#+"); for (int i = 0; i < abc.length; i++) { Syst
public class Main
{
public static void main(String[] args)
{
String inputString = "#..#...##";
String[] abc = inputString.trim().split("#+");
for (int i = 0; i < abc.length; i++)
{
System.out.println(abc[i]);
}
System.out.println(abc.length);
}
}
公共类主
{
公共静态void main(字符串[]args)
{
String inputString=“#…#…#…##”;
String[]abc=inputString.trim().split(“#+”);
for(int i=0;i
输出abc是长度为3的数组。
abc[0]为空字符串。abc中的另外两个要素是。。而且
如果我的输入字符串是“.”##……”。在split函数返回的数组中,我没有得到空字符串。在这两种情况下,输入字符串都没有尾随空格
soemone能解释一下为什么在上面显示的代码中会有一个额外的空格吗?当您按
+
拆分时,输入字符串的第一个字符是
,然后输入在开始时被拆分,得到的是一个空字符串作为字符串的第一个元素。这是因为第一个#
的左侧只是锚定^
,它将只在结果数组中提供一个空字符串。您不会获得额外的空间,而是获得空字符串(长度为0)。javadoc中这样说:
* <p> When there is a positive-width match at the beginning of this
* string then an empty leading substring is included at the beginning
* of the resulting array. A zero-width match at the beginning however
* never produces such empty leading substring
*当本节开头有正宽度匹配时
*字符串,则在开头包含一个空的前导子字符串
*结果数组的。但是,开始时的零宽度匹配
*从不生成这样的空前导子字符串
来自:
该方法的工作原理类似于使用给定表达式和零限制参数调用双参数split方法。因此,结果数组中不包括尾随的空字符串
以及:
如果n为零,则将尽可能多次应用该模式,数组可以有任何长度,并且将丢弃尾随的空字符串
无论何时说.split为字符串,它都会将满足该条件的字符串拆分n次 所以当你说
String inputString = "#..#...##";
拆分的条件是
#
,由于第一次出现#
之前的值是空的
,abc[0]
将保持空的
。因此,abc的计数将返回3,因为abc[0]=nothing(空字符串),abc[1]=。。abc[2]=…如果我的猜测是正确的,它被拆分为“”、“…”。第一个分隔符之前有一个空字符串,因此返回一个空字符串。除非您提供一个额外的参数进行拆分,否则不会返回结尾处的空字符串。结尾处还有$
。这与答案有什么关系?任何匹配的分隔符都只会导致LHS标记进入结果数组。这不完全是真的,“o”。split(“o”,2)
给出一个包含两个空字符串的数组。也就是说,^(match)$
在匹配的两边都给出了空字符串。这只是由于您的第二个参数。您能否提供指向java文档的链接?当然,第一个结果:发布正确的链接。它在Java8SDK中