我正在寻找一个支持API来添加多个表达式的正则表达式库 (在步骤中),每个上下文;使用时应返回上下文 [opaque] 匹配器(以便我知道哪个表达式匹配)。例如:
re_t re;
int context = 1;
...
reg_add(re, "a{5}b", &context);
...
context = 2;
reg_add(re, "x(p|q)y", &context);
...
reg_match(re, mystring_subject, &context, &begin, &end); // <-- context returned among other info
我查看了Regex9(plan9),Onig和PCRE,但我没有看到这样的API存在 PCRE有一个标注工具,但必须将其添加到每个表达式中 已编译,并且限制为255.有没有人知道任何开放域正则表达式库 它支持这种类型的API,或任何易于修改的lib来支持这个?
P.S。我正在寻找一个基于C的lib。
答案 0 :(得分:1)
如果我理解正确,您正在寻找一种方法来使用多个正则表达式同时搜索字符串,并确定哪些正则表达式实际找到了匹配项。
适用于任何正则表达式库的一种解决方案是使用交替将所有正则表达式串起来,并使用(命名)捕获组来确定匹配的正则表达式。在您的示例中,您可以将正则表达式合并到(?<context1>a{5}|b)|(?<context2>x(p|q)y)
中。当此正则表达式找到匹配项时,匹配的文本将存储在捕获组context1
或捕获组context2
中。
如果您希望将正则表达式分开,另一种解决方案是迭代正则表达式列表,为每个正则表达式调用match()
函数,然后查看哪一个找到最左边的匹配项。我在我的网站上有一篇关于matching programming language constructs的文章,它更详细地解释了这种技术。这适用于任何允许您检索匹配位置的正则表达式库(大多数都可以)。
答案 1 :(得分:0)
我不认为这个“上下文”逻辑是任何正则表达式库的一部分,但你可以自己编程。您可以将每个正则表达式存储在映射(字典)中作为键,相应的值将是该特定正则表达式的“上下文”。然后,当您匹配输入字符串时,迭代地图的所有条目,如果找到匹配项,则返回相应的“上下文”值。这可以封装到模块或类中,并提供您正在寻找的API。