我有很多看起来像这样的文本(这是示例):
一些随机字符串,内容等,没有什么特别的开放XZXDS第一个文字我想得到。另一个随机字符串,一些不必要的新闻等关闭我希望获得的第二个文本。然后更多的内容和内容打开LLXAS第三篇文章,我想得到。再次无聊的消息,没有什么关闭我希望得到的第四个文字。等等...
我希望得到包含单词的每个句子:TEXT。例如,在这种情况下,我会得到:
我想要的第一篇文章。
我想得到的第二篇文章。
我想得到的第三篇文章。
我想得到的第四篇文章。
我认为可能的方式是: 在我的文本中有随机文本,但是这个文本总是结束"打开XXXX"或" CLOSING" 。所以我认为我可以得到我的文字,这是在#34;开放的XXXX"或" CLOSING"和"。" (点)。 XXX可以不同,需要排除。 somene可以为此帮助正则表达式功能吗?
只要忘记OPENING BY之前的所有内容,在OPENING BY之后排除一个单词,得到我的文字直到它到达"。"
我曾经有类似的东西,但它更容易,因为我在两个点之间得到了具有特定词的句子。我现在的句子之间没有两个点。 我正在为以前的代码添加代码:
String pattern = "[^\.]*\bSPECIFICWORD\b[^\.]*"
我认为我们可以保留第二部分,但第一部分需要修改。
我的Java应用程序需要它。 谢谢你的帮助。
答案 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