正则表达式使用特定单词

时间:2016-12-05 23:26:01

标签: java regex

我有很多看起来像这样的文本(这是示例):

  

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

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

  

我想要的第一篇文章。

     

我想得到的第二篇文章。

     

我想得到的第三篇文章。

     

我想得到的第四篇文章。

我认为可能的方式是: 在我的文本中有随机文本,但是这个文本总是结束"打开XXXX"或" CLOSING" 。所以我认为我可以得到我的文字,这是在#34;开放的XXXX"或" CLOSING"和"。" (点)。 XXX可以不同,需要排除。 somene可以为此帮助正则表达式功能吗?

只要忘记OPENING BY之前的所有内容,在OPENING BY之后排除一个单词,得到我的文字直到它到达"。"

我曾经有类似的东西,但它更容易,因为我在两个点​​之间得到了具有特定词的句子。我现在的句子之间没有两个点。 我正在为以前的代码添加代码:

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

我认为我们可以保留第二部分,但第一部分需要修改。

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

1 个答案:

答案 0 :(得分: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))以&#34开头;以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