首页 文章

正则表达式用特定的单词得到句子

提问于
浏览
0

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

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

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

我想得到的第一篇文章 . 我希望得到的第二篇文章 . 第三篇文章,我想得到 . 我希望得到的第四篇文章 .

我认为可能的方式是:在我的文本中有随机文本,但是这个文本总是以“打开XXXX”或“关闭”结束 . 所以我认为我可以在“打开XXXX”或“关闭”和“ . ”之间得到我的文字 . (点) . XXX可以不同,需要排除 . somene可以为此帮助正则表达式功能吗?

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

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

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

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

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

1 回答

  • 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)) 以"opening by xxx"或"closing"开头

    (?:[^\\.]*? )* 任何非点字符后跟空格(取决于您的需求空间可以排除)零次或多次

    (?:[^\\.]*?))\\. 非点序列后跟 .

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

    正如评论中所讨论的,如果你想要捕获包含两个单词中任何一个单词的句子,比如ONE或ANOTHER,只需用 (?:ONE|ANOTHER) 替换TEXT . 它在逻辑运算符部分的Pattern docs中进行了描述 .

    如果你想知道你抓到了哪一个,你可以使用捕获组 (ONE|ANOTHER) 并在_1795761中获取它:

    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
    

相关问题