2016-12-05 82 views
0

我有很多的文字,看起来像(这是例子):正则表达式得到句子与特定的单词

一些随机字符串,内容等,没有什么特别的开幕式上的我想XZXDS第一个文本。另一个随机字符串,一些不必要的消息等CLOSING我想要得到的第二个文本。然后更多的内容和内容打开我希望得到的LLXAS第三个文本。再次无聊的消息,没有关闭我想要得到的第四个文本。等等...

我想要得到每个包含单词的句子:TEXT。例如,在这种情况下,我会得到:

我想要的第一个文本。

我想要的第二个文本。

我想要的第三个文本。

我希望得到的第四个文本。

我认为这是可能的方式是: 在我的文字有随机文本,但本文最后总是“开幕式上的XXXX”或“关闭”。所以我认为我可以在“XXXX”或“CLOSING”和“。”之间输入我的文字。 (点)。 XXX可以不同,它需要排除。有人可以帮助正则表达式函数吗?

只要打开开始前的所有内容,排除一个单词是什么在打开后,让我的文字,直到它达到“。”。

我曾经有类似的东西,但是因为我用两个点之间的特定单词来判断句子,所以更容易些。现在我的句子之间没有两个点。 我添加的代码为我曾经有:

String pattern = "[^\.]*\bSPECIFICWORD\b[^\.]*" 

,我认为我们能保持的第二部分,但第一部分需要进行改性壳聚糖。

我需要它为我的Java应用程序。 谢谢你的帮助。

+0

提高您的示例文本请,因为它没有包括“开幕式上的”和'CLOSING'文本。 – Bruno

+0

@布鲁诺我改进了一点,希望你能理解我想达到的目标。 – ktos1234

回答

2
Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))" 
      + "((?:[^\\.]*?)*TEXT(?:[^\\.]*?))\\." 
      , Pattern.CASE_INSENSITIVE); 
    final String text = "random text random text random text opening " 
      + "by xysd FIRST TEXT I WANT TO GET. random text random " 
      + "text random text closing SECOND TEXT I WANT TO GET. " 
      + "random text random text random text opening by lxcvznk " 
      + "THIRD TEXT. random text random text random text random " 
      + "text closing FOURTH TEXT...etc"; 
    Matcher m = p.matcher(text); 
    while(m.find()) 
    { 
     System.out.println(m.group(1)); 
    } 

输出:

FIRST TEXT I WANT TO GET 
SECOND TEXT I WANT TO GET 
THIRD TEXT 
FOURTH TEXT 

(?:opening by [^ ]+)|(?:closing))开始于“由XXX开口”或“关闭”

(?:[^\\.]*?)*任何非点的字符,随后空间(根据需要的空间可以被排除)零次或多次

(?:[^\\.]*?))\\.其后是非点序列。

如果文本输入异常大,单个正则表达式可能不是最好的方法,它可能会更快地搜索前缀,然后明确点字符。

正如评论中所讨论的那样,如果要捕获包含两个单词中的任何一个的句子,例如ONE或ANOTHER,只需使用(?:ONE|ANOTHER)替换TEXT。它在逻辑运算符部分的Pattern文档中有描述。

如果你想知道究竟你是否明白哪一个,你可以使用捕获组(ONE|ANOTHER)并把它在matcher.group(2)

Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))" 
      + "((?:[^\\.]*?)*(ONE|ANOTHER)(?:[^\\.]*?))\\." 
      , Pattern.CASE_INSENSITIVE); 
    final String text = "random text random text random text opening " 
      + "by xysd FIRST ONE I WANT TO GET. random text random " 
      + "text random text closing SECOND ANOTHER I WANT TO GET. " 
      + "random text random text random text opening by lxcvznk " 
      + "ANOTHER TEXT. random text random text random text random " 
      + "text closing FOURTH ONE...etc"; 
    Matcher m = p.matcher(text); 
    while(m.find()) 
    { 
     System.out.println(m.group(1) + "<-" + m.group(2)); 
    } 

FIRST ONE I WANT TO GET<-ONE 
SECOND ANOTHER I WANT TO GET<-ANOTHER 
ANOTHER TEXT<-ANOTHER 
FOURTH ONE<-ONE 
+0

文字输入很大,它来自html文档,我想要得到的文字就在这个文档的底部。我会尝试你为我写的功能,我们会看到。 – ktos1234

+0

大到我的意思是处理成千上万兆字节的文件,单个html可能在现代硬件上可以忽略不计。 –

+0

好吧,我查过了,它工作正常!谢谢。还有一个问题。我有一个按钮,点击后我想转到下一句话。我是否必须将所有匹配放在数组中,还是最简单的方法在所有句子之间移动? – ktos1234

相关问题