regex 使用GoogleTest的正则表达式匹配器进行大小写不敏感的正则表达式匹配?

wvt8vs2t  于 2023-06-30  发布在  Go
关注(0)|答案(2)|浏览(153)

提问

我正在寻找如何使一个正则表达式大小写不敏感,与GoogleTest的正则匹配器(例如:ContainsRegex)。
我尝试用(?i)作为表达式的前缀,或者用/ + /i Package 它们,但没有成功:

EXPECT_THAT("ExpreSSion", ContainsRegex("(?i)expression"));
EXPECT_THAT("ExpreSSion", ContainsRegex("/expression/i"));

有人知道GoogleTest使用什么正则表达式引擎吗?它是否支持不区分大小写的表达式?

不愉快的解决方法

我现在的解决方法是在匹配之前降低所有字符,但这会使单元测试的可读性降低,而且这不是一个好的做法。我想测试实际生成的数据,而不是在测试之前修改它。

EXPECT_THAT(toLower("ExpreSSion"), ContainsRegex("expression"));

当然,在上面的例子中,表达式在编译时是已知的,可以显式地匹配每个字符的任何大小写,但是它变得非常不可读

EXPECT_THAT("ExpreSSion", ContainsRegex("[Ee][Xx][Pp][Rr][Ee][Ss][Ss][Ii][Oo][Nn]"));

这是可以自动化的,但是我们真的必须去那些范围来匹配一个忽略大小写的字符串吗?当然,这必须得到图书馆开箱即用的支持?

auto ContainsRegexCaseInsensitive(const std::string &expr)
{
    static const auto ignoreLetterCases = [](const std::string &expr) -> std::string 
    {
        // Replacinging letters with [<upper><lower>]
        // ...
    };
    return ContainsRegex(ignoreLetterCases("expression"));
}
EXPECT_THAT("ExpreSSion", ContainsRegexCaseInsensitive("expression"));
xxb16uws

xxb16uws1#

根据谷歌的文档
当使用Bazel和Abseil构建时,GoogleTest使用RE2语法。
后者有一种使用 flags 指定大小写不敏感搜索的方法(参见here):

(?flags)    set flags within current group; non-capturing
(?flags:re) set flags during re; non-capturing
Flags
i   case-insensitive (default false)

因此,(?i)应该工作,如果它不工作,你可以用Abseil重建GoogleTest。

xjreopfe

xjreopfe2#

默认情况下,这两个表达式都不起作用。
对于使用RE 2表达式,如“(?i)expression”你必须使用-DGTEST_HAS_ABSL=ON cmake选项来构建GoogleTest,否则它将使用自己的有限POSIX扩展正则表达式语法的实现,而不带标志。请参阅googletest/src/gtest-port.cc:726了解更多细节。

相关问题