使用Java编写正则表达式从文本中提取单词

5
我正在使用正则表达式编写Java程序,我有许多句子结构。给定字符串为:"book 'learning java' for doctor ahmed mohamed" 或 "the best title: learning java for ahmed mohamed" 等等。
意思是:
(book) 可能是 [the book或text:或(text)]。
(for doctor) 可能是 [for author或for或by for doctor]。
输出:
我想提取在(book)之后并在(for doctor)之前的任何单词,并将其命名为Title。提取在(for doctor)之后的任何单词并将其命名为Author。
String inputtext =  "book 'learning java' for doctor  ahmed mohamed";

    Pattern p = Pattern.compile("(?<=(book| the book| \\( . \\)|\\:)) .*? (?=(for doctor| for| for author))");

    Matcher m = p.matcher(inputtext);


        if (m.matches()) {
        String author = m.group(1).trim();
        String bookTitle = m.group(2).trim();

        System.out.println("Title is : " + author);
        System.out.println("Author is : " + bookTitle);

4
那么问题是什么? - Thomas
请回答这个问题。 - Shimaa Mohamed
如何编写表达式 in(pattern p) 和(pattern pa)? - Shimaa Mohamed
问题可能是大多数读者在这里可能不理解帖子,因为输入文本以及模式使用阿拉伯文 - 对于那些不熟悉该语言的人来说很难解密,特别是由于其RTL性质。您能否提供一个示例,使用英文字母作为输入字符串以及表达式? - Thomas
你说 (书)可能是[书或文本:或(文本)],但你仍然有一个例子不符合这个规则: 最佳标题:为艾哈迈德·穆罕默德学习Java。是否有固定的语法将被使用,还是以下也可能:'学习Java'由艾哈迈德·穆罕默德艾哈迈德·穆罕默德:学习Java等? - 如果是后者,正确提取标题和作者可能会相当困难。 - Thomas
显示剩余2条评论
1个回答

0

我会尝试提供一些提示,但由于我无法读取您的表情,所以只能猜测。

因此,您的表达式是这样的:

(?<=(للدكتورة|للعلامه|للشيخ|للكاتب |للكاتبه|للامام|للاستاذ|للقاضى|للدكتور|ل ))\s[^\s]+\s[^\s]+

分解一下,它看起来像这样:

  • 正向后瞻为(?<=(للدكتورة|للعلامه|للشيخ|للكاتب |للكاتبه|للامام|للاستاذ|للقاضى|للدكتور|ل ))
  • 一个空格字符后跟一些单词
  • 一个空格字符后跟一些单词

基本上匹配将是任何包含2个空格-单词组合并且以您的匹配中的任何单词之一为前缀的序列。

这似乎是您实际的问题,因为您已经说明:

这个表达式只给我两个单词

一种可能的解决方案是匹配超过2个单词,甚至可能有多个空格。所以在你的回溯之后,尝试这样做:(?>\s+[^\s]+)+而不是\s[^\s]+\s[^\s]+。这部分应该匹配任何由空格后跟非空格字符组成的序列,例如(用英文字母表示)它将匹配aaa bbb以及aaa bbb ccc ddd(HTML不会在此处显示多个空格,但请想象间隔大于一个空格)。

请查看模式p中的正则表达式,并回答这个模式中的哪些更改可以让我得到两侧字符串之间的内容。 - Shimaa Mohamed
@ShimaaMohamed 能否用英文字母提供一个问题示例?你表达式中的LTR-RTL切换让我感到很抓狂,这使得理解实际表达式变得非常困难(哪个是第一个,哪个是最后一个等等)。请尽量提供更具可读性的示例。 - Thomas
我将转换成我想要的英文。 - Shimaa Mohamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接