与regex.h的全字匹配

时间:2015-06-29 09:21:45

标签: c++ regex

我想要一个与“香蕉”或“睡衣”相匹配的C ++正则表达式,而不是“bananas2”或“bananaspajamas”或“banana”或基本上除了那两个字之外的任何东西。所以我这样做了:

client.[Alias](Function([alias]) [alias].Add(Function(a) a.Index(indexName).[Alias]("alias").Filter(Of Person)(Function(f) f.Term("relationships.staffID", staffID))))

并打印#include <regex.h> #include <stdio.h> int main() { regex_t rexp; int rv = regcomp(&rexp, "\\bbananas\\b|\\bpajamas\\b", REG_EXTENDED | REG_NOSUB); if (rv != 0) { printf("Abandon hope, all ye who enter here\n"); } regmatch_t match; int diditmatch = regexec(&rexp, "bananas", 1, &match, 0); printf("%d %d\n", diditmatch, REG_NOMATCH); } ,好像没有匹配。发生了什么?我也为我的正则表达式尝试1 1,但也失败了。

我问过Whole-word matching using regex关于std :: regex,但是std :: regex很糟糕,所以我正在尝试使用regex.h。

3 个答案:

答案 0 :(得分:1)

The POSIX standard既未指定字边界语法,也未指定BRE和ERE的后视和前瞻语法(可用于模拟字边界)。因此,不可能编写具有跨越不同POSIX兼容平台的字边界的正则表达式

对于便携式解决方案,如果您打算使用C ++进行编码,则应考虑使用PCRE或Boost.Regex。

否则,您将无法使用非便携式解决方案。如果你对这种限制很好,有几种选择:

  • 如果您链接到GNU C库,it extends the syntax to include word boundary, among other things$ valgrind ./test ==11346== Memcheck, a memory error detector ==11346== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==11346== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info ==11346== Command: ./test ==11346== bbaaan ban ==11346== ==11346== HEAP SUMMARY: ==11346== in use at exit: 0 bytes in 0 blocks ==11346== total heap usage: 1 allocs, 1 frees, 7 bytes allocated ==11346== ==11346== All heap blocks were freed -- no leaks are possible ==11346== ==11346== For counts of detected and suppressed errors, rerun with: -v (字边界),\b(非字边界),\B(字开头),{ {1}}(结尾)。
  • 有些系统扩展了BRE和ERE语法,以包含\<(单词开头),\>(单词结束)语法。

答案 1 :(得分:0)

康拉德留下了一个很好的答案,解决了我的问题,但它以某种方式消失了,所以我不能接受它。以下是为后人打印正确内容的代码:

#include <regex.h>
#include <stdio.h>

int main()
{
  regex_t rexp;

  int rv = regcomp(&rexp, "[[:<:]]bananas[[:>:]]|[[:<:]]pajamas[[:>:]]", REG_EXTENDED | REG_NOSUB);
  if (rv != 0) {
    printf("Abandon hope, all ye who enter here\n");
  }
  regmatch_t match;
  int diditmatch = regexec(&rexp, "bananas", 1, &match, 0);
  printf("%d %d\n", diditmatch, REG_NOMATCH);
}

答案 2 :(得分:-1)

使用

s == "balances" || s == "pajamas"

sstd::string

正则表达式可能会使一个简单的解决方案过于复杂。如果你想要一个固定的匹配,特别要避免它们。