3

我想匹配两个字符串之间的文本,但起始字符串有严格的边界条件。

样本输入:

start
From: h
From:b
 xyz
Subject: 
end

我需要在 和 之间进行From:匹配Subject:

如果我(From:.*).*(Subject:)与 dotall 一起使用,它会产生

From: h
From:b
 xyz
Subject:

但我只需要

From:b
 xyz
Subject:

因为起始字符串有严格的边界条件。这是必要的,因为起始字符串可以在文档中的任何位置,然后上面的正则表达式将匹配一个大文本,而不仅仅是几行。

%%%%%%%%%%%% 问题重新定义 %%%%%%%%%%%%%% 我有需要匹配的文本:

From:<any text>
To:<any text>
Subject:<any text>

问题是:所有三个组件都可以在一行中,可以由一个换行符分隔,或者可以由 2 个换行符分隔......在所需的匹配之前和之后有文本可以包含From:<any text>,这就是我需要严格的原因边界。

4

4 回答 4

2

试试这个:

String input = "start From: h From:b xyz Subject: end";
Matcher matcher = Pattern.compile("(?<=^((?!From:).)*(From: [A-Za-z0-9] ))(.+?)(Subject:)").matcher(input);
if (matcher.find())
{
    System.out.println(matcher.group());
}

输出:From:b xyz Subject:


正则表达式 ( (?<=^((?!From:).)*(From: [A-Za-z0-9] ))(.+?)(Subject:)) 的解释:

  • (?<=开始往后看
  • ^字符串的开头
  • ((?!From:).)如果向前看并且看不到“From:”,则匹配任何字符
  • *匹配前一个语句零次或多次
  • (From: [A-Za-z0-9] ))匹配第一个“发件人:”及其内容
  • )停止向后看
  • (.+?)匹配我们正在寻找的字符串
  • (Subject:)匹配主题字段
于 2013-04-28T00:46:46.387 回答
0

而不是.*在 DOTALL 模式下使用,我建议您断言该行不以From:.

"(?m)^From:.*[\r\n]+(?:(?!From:).*[\r\n]+)*Subject:.*$"

这是最低限度的实现。根据文本的结构,它仍然可能匹配太多或太慢(尤其是在无法匹配的情况下)。这是一个更强大的版本:

"(?m)^(?>From:.*[\r\n]+)(?>(?!From:|Subject:).*[\r\n]+)*+Subject:.*$"
于 2013-04-28T03:48:59.273 回答
0

简单地:

From\:\w*(?!From\:\w*)\n*\w*\n*Subject:\w*

演示:https ://regex101.com/r/mX9kC7/3

于 2015-12-27T00:18:16.407 回答
0

使用多行修饰符和负前瞻:

(?s)From:((?!From:).)*?Subject: @ regex101

注意: regex101 fiddle 包含实时正则表达式和测试数据。

于 2015-12-26T23:57:38.787 回答