正则表达式的开头和结尾

时间:2016-02-14 12:30:19

标签: java regex string

有没有办法在Java中匹配句子的开始结束?最简单的情况是以简单(。)点结尾。在其他一些情况下,它可以以colum(:)或以colum(。:)结尾的快捷方式结束。

例如一些随机新闻文字:

  

在该市发生地震期间,新西兰的悬崖已经倒塌   基督城在南岛。没有严重的伤害或死亡   在当地时间13:13发生的情人节地震中报道了这一情况   时间。根据 med。报告,每个人都可以。

我的目标是获取单词的快捷方式+它的上下文,但如果可能的话,只有快捷方式所在的句子。

所以,如果我能得到这样的东西,那么我的成功输出将是:

  

选定的字 - >折叠

     

上下文 - >在南岛基督城市发生地震时,新西兰的悬崖倒塌了。

     

选定的字 - > MED。

     

上下文 - >根据 med。报告,每个人都可以。

由于

3 个答案:

答案 0 :(得分:3)

您正在寻找的是一种自然语言处理工具包。对于java,您可以使用:CoreNLP 他们的教程页面上已经有一些示例案例。 你当然可以制作一个正则表达式来查找字符集之间的所有字符(。:?etc ...),它看起来像这样:

\.*?(?=[\.\:])\

然后你必须遍历匹配的结果并找到包含你的单词的相关句子。但我建议您使用NLP来实现这一目标。

答案 1 :(得分:3)

代码:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

   public static void main( String[] args ) {
      final Map<String, String> dict = new HashMap<>();
      dict.put( "med", "medical" );
      final String text =
         "Cliffs have collapsed in New Zealand during an earthquake in the "
         + "city of Christchurch on the South Island. No serious damage or "
         + "fatalities were reported in the Valentine's Day quake that struck "
         + "at 13:13 local time. Based on the med. report everybody were ok.";
      final Pattern p = Pattern.compile( "[^\\.]+\\W+(\\w+)\\." );
      final Matcher m = p.matcher( text );
      int pos = 0;
      while(( pos < text.length()) && m.find( pos )) {
         pos = m.end() + 1;
         final String word = m.group( 1 );
         if( dict.containsKey( word )) {
            final String repl            = dict.get( word );
            final String beginOfSentence = text.substring( m.start(), m.end());
            final String endOfSentence;
            if( m.find( pos )) {
               endOfSentence = text.substring( m.start() - 1, m.end());
            }
            else {
               endOfSentence = text.substring( m.start() - 1);
            }
            System.err.printf( "Replace '%s.' in '%s%s' with '%s'\n",
               word, beginOfSentence, endOfSentence, repl );
            final String sentence =
               ( beginOfSentence + endOfSentence ).replaceAll( word+'.', repl );
            System.err.println( sentence );
         }
      }
   }
}

执行:

Replace 'med.' in 'Based on the med. report everybody were ok.' with 'medical'
Based on the medical report everybody were ok.

答案 2 :(得分:2)

你很容易发现这句话。它以大写字母开头,以.:!?个字符之一结尾,后跟空格和另一个大写字母,或者到达整个字符串的末尾。

比较差异time. Basedmed. report

因此捕获整个句子的正则表达式应如下所示:

([A-Z][a-z].*?[.:!?](?=$| [A-Z]))

看一看! Regex101