我想要一个与“香蕉”或“睡衣”相匹配的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。
答案 0 :(得分:1)
The POSIX standard既未指定字边界语法,也未指定BRE和ERE的后视和前瞻语法(可用于模拟字边界)。因此,不可能编写具有跨越不同POSIX兼容平台的字边界的正则表达式。
对于便携式解决方案,如果您打算使用C ++进行编码,则应考虑使用PCRE或Boost.Regex。
否则,您将无法使用非便携式解决方案。如果你对这种限制很好,有几种选择:
$ 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}}(结尾)。\<
(单词开头),\>
(单词结束)语法。答案 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"
而s
是std::string
。
正则表达式可能会使一个简单的解决方案过于复杂。如果你想要一个固定的匹配,特别要避免它们。