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成为我输出的一部分。这是我正在寻找的输出。然而,他确实与命运中最年轻的方面克洛索有染。下一句。。。。。。