3

我有一个这样的字符串:

"result is abcdefg hij!klm </td" (或其他所有内容,而不是 abcd ...)

我制作的正则表达式是:
"result is ([^<]+) </td"

这很有效,因为找到了结果。但是当字符串是:
"result is not found </td"
...我怎样才能避免提取单词“未找到”?

我知道有负面的前瞻表达式,但这些在 C99 的 regex.h 中不起作用。

  • "(?!not found)"-> 错误的正则表达式
  • "([^n][^o][^t][^ ][^f]..)"-> 不匹配“现在”,例如
  • "(([^<]+)&(!not found))"-> 错误的正则表达式

(没有'&'运算符,我认为解决方案可以是a&&b == !a||!b:)

--EDIT--
这是计算正则表达式的代码部分。

pmatch=malloc(nmatch*sizeof(regmatch_t));  

printf("regex: %s\n",patrn);

if (regcomp(&rgT,patrn,REG_EXTENDED | REG_NEWLINE) != 0)
{
    snprintf(globals.err_buff,MAX_BUFF,"bad regex: \"%s\"",patrn);
    w_report_error(globals.err_buff,__FILE__,__LINE__,__func__,0,0,error);
    return EXIT_FAILURE;
}

-- 编辑 --
也许我找到了一个解决方案:
我自己的正则表达式函数返回第 N 个反向引用,如果将一个数字 > 0 作为参数传递给它,所以...
注意:./regex只是一个重定向 argv[...] 的 C 程序到我自己图书馆的 w_regexp。

$ ./regex "result is crack </td" 'result is (not found) </td|result is ([^<]+) </td' 3
regex: result is (not found) </td|result is ([^<]+) </td
"crack"
""
"result is crack </td"
$ ./regex "result is not found </td" 'result is (not found) </td|result is ([^<]+) </td' 3
regex: result is (not found) </td|result is ([^<]+) </td
""
"not found"
"result is not found </td"  

所以,我认为在我的结构中添加一个数字,这意味着用于提取数据的反向引用的索引可以是一个解决方案,但我仍然会在另一天等待更好的方法,或者 2.
提前致谢.

--EDIT--(太多次:))
它有效!我已经把我想避免追随者的字符串放在'|' 以及正确字符串的模式。
这是正则表达式:
"result is not found </td|result is ([^<]+) </td"
再次感谢。

4

2 回答 2

0

Aztaroth 的作品也是result is ((?!not found)[^<]+) </td- 不同之处在于他注册的是空匹配,而我的没有注册匹配。

经测试

result is abcdefg hij!klm </td
result is not found </td
result is not this </td
result is note this </td
result is ote this </td

编辑:耻辱,好吧 - 这很懒惰而且有点恶心,但是用正则表达式两次通过怎么样?第一个检查 'not found' 上的匹配项result is (not found) </td。然后,使用原始正则表达式进行不匹配,去掉结果。

于 2012-05-29T07:56:58.973 回答
0

也许像"result is (?:not found)?([^<]+)</td"什么?

于 2012-05-29T07:47:55.983 回答