Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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';s split方法具有前导空白记录,我可以';不抑制_Java_String_Parsing_Split - Fatal编程技术网

Java';s split方法具有前导空白记录,我可以';不抑制

Java';s split方法具有前导空白记录,我可以';不抑制,java,string,parsing,split,Java,String,Parsing,Split,我正在分析一个输入文件,该文件有多个关键字,前面有一个+。+是我在拆分中的分隔符,单个标记被写入数组。生成的数组在[0]位置包含一条空白记录 我怀疑split是在第一个标记前面加上“nothing”并填充project[0],然后转移到所有显示正确的后续标记 表示此方法有一个限制参数: 如果n为零,则该模式将应用尽可能多的次数 可能的话,数组可以有任何长度,尾随空字符串 将被丢弃 我发现,但提出的解决方案是,编辑掉前导分隔符(我使用子字符串(1)创建了一个临时字段),为我生成了相同的空白记录 代

我正在分析一个输入文件,该文件有多个关键字,前面有一个
+
+
是我在
拆分
中的分隔符,单个标记被写入数组。生成的数组在
[0]
位置包含一条空白记录

我怀疑
split
是在第一个标记前面加上“nothing”并填充
project[0]
,然后转移到所有显示正确的后续标记

表示此方法有一个
限制
参数:

如果n为零,则该模式将应用尽可能多的次数 可能的话,数组可以有任何长度,尾随空字符串 将被丢弃

我发现,但提出的解决方案是,编辑掉前导分隔符(我使用
子字符串(1)
创建了一个临时字段),为我生成了相同的空白记录

代码和输出如下所示。任何提示都将不胜感激

import java.util.regex.*;
import java.io.*;
import java.nio.file.*;
import java.lang.*;
//
public class eadd
{
    public static void main(String args[])
    {
        String projStrTemp = "";
        String projString = "";
        String[] project = new String[10];
        int contextSOF = 0;
        int projStringSOF = 0;
        int projStringEOF = 0;
       //
        String inputLine = "foo foofoo foo foo @bar.com +foofoofoo +foo1 +foo2 +foo3";
        contextSOF = inputLine.indexOf("@");
        int tempCalc = (inputLine.indexOf("+")) ;
        if (tempCalc == -1) {
            proj StrTemp = "+Uncategorized";
        } else {
            projStringSOF = inputLine.indexOf("+",contextSOF);
            projStrTemp = inputLine.trim().substring(projStringSOF).trim();
        }
        project = projStrTemp.split("\\+");
       //
        System.out.println(projStrTemp+"\n"+projString);
        for(int j=0;j<project.length;j++) {
        System.out.println("Project["+j+"] "+project[j]);
        }
    }

CONSOLE OUTPUT: 
+foofoofoo +foo1 +foo2 +foo3

Project[0]
Project[1] foofoofoo
Project[2] foo1
Project[3] foo2
Project[4] foo3
import java.util.regex.*;
导入java.io.*;
导入java.nio.file.*;
导入java.lang.*;
//
公共级eadd
{
公共静态void main(字符串参数[])
{
字符串projStrTemp=“”;
字符串projString=“”;
字符串[]项目=新字符串[10];
int contextSOF=0;
int projStringSOF=0;
int projStringEOF=0;
//
String inputLine=“foo foo foo@bar.com+foo+foo1+foo2+foo3”;
contextSOF=inputLine.indexOf(“@”);
int tempCalc=(inputLine.indexOf(“+”);
如果(临时计算器==-1){
项目StrTemp=“+未分类”;
}否则{
projStringSOF=inputLine.indexOf(“+”,contextSOF);
projStrTemp=inputLine.trim().substring(projStringSOF.trim();
}
project=projStrTemp.split(“\\+”);
//
System.out.println(projStrTemp+“\n”+projString);
对于(int j=0;j变化:

projStrTemp = inputLine.trim().substring(projStringSOF).trim();
致:

如果您有一个前导分隔符,那么数组将以一个空白元素开始。您可以尝试使用
split()

public static void main(String[] args) {
    String s = "an+example";

    String[] items = s.split("\\+");
    for (int i = 0; i < items.length; i++) {
        System.out.println(i + " = " + items[i]);
    }
}
String s=“+an+示例”
产生:

0 = an
1 = example
0 = 
1 = an
2 = example
更改:

projStrTemp = inputLine.trim().substring(projStringSOF).trim();
致:

如果您有一个前导分隔符,那么数组将以一个空白元素开始。您可以尝试使用
split()

public static void main(String[] args) {
    String s = "an+example";

    String[] items = s.split("\\+");
    for (int i = 0; i < items.length; i++) {
        System.out.println(i + " = " + items[i]);
    }
}
String s=“+an+示例”
产生:

0 = an
1 = example
0 = 
1 = an
2 = example
一个简单的解决方案是从字符串中删除第一个
+
。这样,它就不会在第一个关键字之前拆分:

projStrTemp=inputLine.trim().substring(projStringSOF+1.trim();

编辑:就我个人而言,我会使用正则表达式寻找一个更健壮的解决方案。这会查找所有前面有
+
的关键字。它还要求
+
前面有一个空格,或者在行首,这样像
3+4
这样的词就不会匹配

String inputLine=“+foo 3+4 foo foo foo@bar.com+foo+foo 1+foo 2+foo 3”;
Pattern re=Pattern.compile(“(\\s|^)\\+(\\w+)”;
匹配器m=重新匹配器(输入线);
while(m.find()){
系统输出println(m.group(2));
}
一个简单的解决方案是从字符串中删除第一个
+
。这样,它就不会在第一个关键字之前拆分:

projStrTemp=inputLine.trim().substring(projStringSOF+1.trim();

编辑:就我个人而言,我会使用正则表达式寻找一个更健壮的解决方案。这会查找所有前面有
+
的关键字。它还要求
+
前面有一个空格,或者在行首,这样像
3+4
这样的词就不会匹配

String inputLine=“+foo 3+4 foo foo foo@bar.com+foo+foo 1+foo 2+foo 3”;
Pattern re=Pattern.compile(“(\\s|^)\\+(\\w+)”;
匹配器m=重新匹配器(输入线);
while(m.find()){
系统输出println(m.group(2));
}

+foo+foo1+foo2+foo3


Splits方法围绕给定+的匹配项拆分字符串,因此数组在第一个元素中包含一个空字段(包含5个元素)。如果要获取以前的数据,请获取inputLine,而不是包含第一个+的已处理的projStrTemp子字符串。

+FooFoo1+foo2+foo3


Splits方法将字符串围绕给定+的匹配项进行拆分,因此数组在第一个元素中包含一个空字段(包含5个元素)。如果要获取以前的数据,请获取inputLine,而不是包含第一个+的已处理的projStrTemp子字符串。

谢谢!效果很好!但这不是做同样的事情吗(更优雅地说)创建一个单独的变量定义为
ProjStrTemp.substring(1)
?如果不是,你能帮助我理解为什么…是的,
ProjStrTemp=ProjStrTemp.substring(1)
会做同样的事情。您必须记住将其分配给变量,因为子字符串不会修改字符串本身。谢谢!效果很好!但这不是做了与创建一个单独的变量定义为
ProjStrTemp.substring(1)相同的事吗(尽管更优雅)
?如果没有,您能帮我理解为什么…是的,
projStrTemp=projStrTemp.substring(1)
也会做同样的事情。你必须记住将其分配给变量,因为子字符串不会修改字符串本身。还要感谢正则表达式。我刚刚开始使用正则表达式,但仍然有点害怕正则表达式。但是我会玩它!@dwwilson66是的,正则表达式有点难读,但是有一些工具可以帮助理解正则表达式ot。其中一些是在《感谢正则表达式》中描述的。我刚刚开始使用正则表达式,但仍然有点被它吓倒。但我会用它来玩的!@dwwilson66是的,正则表达式有点难读,但是有一些工具可以帮上大忙。其中一些是在中描述的