Java 使用正则表达式解析文件中的多行句子

Java 使用正则表达式解析文件中的多行句子,java,regex,Java,Regex,对于包含以下句子的文件: He O O does O O , O O however O O , O O have B-MWE_LVC B-MWE_LVC_VERB an I-MWE_LVC O affair I-MWE_LVC B-MWE_LVC_NOUN with O O Clotho B-NE_PER O , O O the O O youngest O O aspect O O of O O Fate B-NE_MISC B-NE_MISC_SB . O O This O O is O

对于包含以下句子的文件:

He O O
does O O
, O O
however O O
, O O
have B-MWE_LVC B-MWE_LVC_VERB
an I-MWE_LVC O
affair I-MWE_LVC B-MWE_LVC_NOUN
with O O
Clotho B-NE_PER O
, O O
the O O
youngest O O
aspect O O
of O O
Fate B-NE_MISC B-NE_MISC_SB
. O O

This O O
is O O
both O O
awkward O O
and O O
intriguing O O
to O O
Norton B-NE_PER O
since O O
her O O
past O O
is O O
his O O
future B-SENT_BOUND O
. O O
我想根据正则表达式模式提取每个句子。o o标记每个句子的结尾。我已经在下面写了一些代码来解析这个,但是得到了一个错误

线程主java.lang.StringIndexOutOfBoundsException中的异常: 字符串索引超出范围:java.lang.String.substringUnknown处的-1 来源:com.gyan.siapp.coref.resolve.test.maintest.java:46

第46行是:builder.appendstrLine.substring0,strLine.indexOf“”

我的代码:

    public static void main(String args[]) {
    StringBuilder builder = new StringBuilder();
    String  folderPath ="C:/Users/Desktop/Data_And_Sentences/wiki50.iob";

    Scanner file = null;
    try
    {
        file = new Scanner(new File(folderPath));
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

        List<String> sentences = new ArrayList<String>();

        String strLine;

        //Read File Line By Line

   Pattern matchExp = Pattern.compile ("(.*?)(. O O)");
        Matcher m = matchExp.matcher(strLine);

        while (file.hasNext())   
        {

            while (!m.find()){
                builder.append(strLine.substring(0, strLine.indexOf(' ')));
                builder.append(" ");
            }

            sentences.add(builder.toString());

            }
            System.out.println(sentences);
           //return sentences;
    }

这是正确的方法吗?我是否应该使用字符串生成器以外的其他结构来确保足够的内存?我的猜测是,整个文件被读取为一个字符串,因此我得到了这个异常。是吗?

我不知道这对你是否有帮助。下面的代码生成如下输出:-

他,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做,他做例如:他做的,但是,他做的,但是,他做的,但是,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的,他做的这两个方面都很难理解,但是,他有,最年轻的方面。这两个方面都很难理解,但是,他有,最年轻的方面。这两个方面都很难理解,但是,他有,最年轻的方面这对…既尴尬又有趣。这对…既尴尬又有趣。这对…既尴尬又有趣。这对…既尴尬又有趣,因为…他对…既尴尬又有趣。这对…既尴尬又有趣,因为…他对…既尴尬又有趣。这对…既尴尬又有趣这是既尴尬又有趣的,因为她的过去是他的过去,但是,他有,最年轻的方面。这是既尴尬又有趣的,因为她的过去是,他有,但是,最年轻的方面。这是既尴尬又有趣的,因为她的过去是他的,但是,他有,最年轻的方面f.这对她来说既尴尬又有趣,因为她的过去是他的,然而,他却有着最年轻的一面。这对她来说既尴尬又有趣,因为她的过去是他的。]

<code>
  public static void main(String args[]) {
        StringBuilder builder = new StringBuilder();
        String  folderPath ="C:/Users/Desktop/Data_And_Sentences/wiki50.iob";

        Scanner file = null;
        try
        {
            file = new Scanner(new File(folderPath));
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        List<String> sentences = new ArrayList<String>();

        String strLine;
        //String sentence = "";
        //Read File Line By Line
        Pattern matchExp = Pattern.compile ("\\.* O O");
        while (file.hasNext())   
        {

            strLine = file.nextLine();
            System.out.println(strLine);
            Matcher m = matchExp.matcher(strLine);
            if(m.find()) {
                System.out.println(strLine.substring(0, strLine.indexOf(" ")));
                builder.append(strLine.substring(0, strLine.indexOf(" ")));
                builder.append(" ");
            }
        }
        System.out.println(sentences);
        System.out.println(builder.toString());
        //return sentences;
    }
</code>

首先,默认情况下Scanner.next查找并返回下一个完整令牌,该令牌除以空格。因此,strLine将不包含任何空格,然后strLine.indexOf“”将返回-1并导致异常。 您应该将文件逐行读取为一个字符串,然后按模式拆分。\n

    StringBuilder input = new StringBuilder();
    while(file.hasNext()) {
        input.append(file.nextLine());
    }
    String[] sentences = input.toString().split("\\.* O O");

不要每次都重新编译模式,您只需要在循环外重新编译一次。另外,如果需要帮助发布完整的堆栈跟踪,并指示代码中的哪个语句引发异常。@JimGarrison根据您的建议编辑了代码,并提供了完整的错误描述。谢谢。您是想将内容附加到buil中吗der如果有匹配?移除!然后,当m查找时{我强烈建议您在调试器中一行一行地遍历代码,以了解它在做什么。请不要发布猜测作为答案。StackOverflow的目的是作为未来读者的存储库。错误的猜测没有任何好处。这对我的情况没有帮助,因为我只想包含eac的第一个单词h行并创建一个句子。我不希望额外的标签和O O成为我输出的一部分。这是我正在寻找的输出。然而,他确实与命运中最年轻的方面克洛索有染。下一句。。。。。。