5

我使用正则表达式在 Java 中编写程序,我有很多句子给定字符串的结构;“为医生 ahmed mohamed 写的‘学习 Java’一书”。或者“最好的标题:为ahmed mohamed学习java”,等等……,

意思是:

(书)可以是[书或文本:或(文本)]。

(对于医生)可以是[为作者或为或由医生]。

输出:

我想在(书)和(医生)之前提取任何单词并将其命名为标题。并在(对于医生)之后提取任何单词并将其命名为作者。

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

1 回答 1

0

我会尝试提供一个提示,但由于我看不懂你的表情,我只能猜测。

所以你的表达是这样的:

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

在分解中,它看起来像这样:

  • 积极寻找背后(?<=(للدكتورة|للعلامه|للشيخ|للكاتب |للكاتبه|للامام|للاستاذ|للقاضى|للدكتور|ل ))
  • 一个空格字符,后跟一些单词
  • 一个空格字符,后跟一些单词

基本上,匹配将是包含 2 个空格的任何序列 - 单词组合,并且前面是匹配中的任何单词。

正如您所说,这似乎是您的实际问题:

这个表达只给我2个字

一种可能的解决方案是匹配两个以上的单词,甚至可能匹配一个以上的空格。因此,在您向后看之后,试试这个:(?>\s+[^\s]+)+而不是\s[^\s]+\s[^\s]+. 这部分应该匹配任何后跟非空格的空格序列,例如(用英文字母)它会匹配aaa bbbaaa bbb ccc dddHTML 不会在此处显示多个空格,但想象间隙大于一个空格)。

于 2013-03-11T17:41:51.617 回答