我可以在正则表达式中使用带或运算符的前瞻断言吗?

时间:2014-02-25 18:05:23

标签: c++ regex boost assertion lookahead

我正在编写一个程序来查找某本书的打印对象。我有一个印记行,我必须提取名称。请注意,每个印记行不包含X个人,这意味着该书可以为一个或多个人编写。

以下是印记行的示例:

“[[伦敦]:在Ianuarie 1587完成,​​以及29岁的Queenes Maiesties reigne,完全延续了前任,为Iohn Harison,George Bishop,Rafe Newberie,Henrie Denham和Thomas VVoodcocke。伦敦[由亨利·德纳姆]在Starre的signe的Aldersgate街上印刷,“

我有一个正则表达式,与上面一行中的“Iohn Harison,George Bishop,Rafe Newberie,Henrie Denham和Thomas Woodcock。在伦敦”相匹配。

问题是:正则表达式的编码方式将匹配下一句,因为它将以大写字母开头,后者将与名称正则表达式匹配。此外,我不能只搜索一段时间,因为可以有一个首字母列表:J.D。,K.G。,& V.X。

字符串名称基本上匹配名称可以包含的任何格式。

名称将匹配:( John | John Day | John Wayne Day | John-Day | JD | John | J. | JD | .JD | mcJohn Day)并且每个名称必须包含大写字母,并且名称可以是由多个名字组成。

以下是当前代码:

string line = imprint_line;

string name("(\\s[a-z]*[A-Z\\.]+[a-z\\.:-]*)+");
regex reg("[Ff]or"+name+"((,|,?\\sand|\\s&)?"+name+")*");

smatch matches;

if (regex_search(line, matches, reg))
    printedFor = matches[0];

我想将 reg 更改为预测& ,和

我正在尝试这样的事情:

regex reg("[Ff]or"+name+"(?=(,|,?\\sand|,?\\s&))"+name+")*");

但这会返回正则表达式错误。有什么事我能做到吗?

提前感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

这是你当前的正则表达式清理了一下 我无法弄清楚为什么你需要前瞻 你能更好地解释一下吗?

 [Ff] or
 (?: \s [a-z]* [A-Z.]+ [a-z.:-]* )+
 (?:
      (?: , | ,? \s and | \s & )?
      (?: \s [a-z]* [A-Z.]+ [a-z.:-]* )+
 )*

这是你得到的错误

     [Ff] or
     (?:
          \s [a-z]* [A-Z.]+ [a-z.:-]* 
     )+
     (?= , | ,? \s and | ,? \s & )
     (?:
          \s [a-z]* [A-Z.]+ [a-z.:-]* 
     )+
=    )  <-- Unbalanced  ')'
     *