如何匹配从资本和非资本字母开始的单词?

时间:2015-10-25 00:04:32

标签: c++ regex

我正在尝试创建一个与cat之类的常规字匹配的正则表达式,但也可以在不同情况下匹配该字。

例如,如果我有一个表达式[Cc]at,那么正则表达式会匹配,我可以在我的程序中使用它来搜索包含字符串catCat的文件。但是,如果我的表达只是Catcat,我仍然希望能够在此处进行正则表达式匹配,并仅搜索该表达式的文件。

我认为第一部分匹配,但是如果有一些正则表达式向导可以解释这是如何完成的那就太棒了!

这是我的尝试:

([^?][A-Z][a-z][^?]*)

...符合[Cc]at但不符合catCat

2 个答案:

答案 0 :(得分:2)

您正在谈论不区分大小写的匹配。它以各种方式启用,具体取决于正则表达式的风格和上下文:作为后缀修饰符(/cat/i);作为内联修饰符("(?i)cat");作为选项("i"re.IPattern.CASE_INSENSITIVERegexOptions.IgnoreCase等等;或者,如果您正在使用图形搜索/替换小部件,请选中相应的框。

如果你想第一个字母不区分大小写,那么就无法从正则表达式之外做到这一点。要匹配任何单词,可以以大写或小写字母开头但之后必须只包含小写字母,您可以使用[A-Za-z][a-z]*。或者等效于Unicode的\p{Lu}\p{L}*

顺便说一下,这是你的正则表达式所做的:

([^?][A-Z][a-z][^?]*)
  • 第一个[^?][匹配(这意味着? 之外的任何字符,我猜测的不是您的意图)。
  • [A-Z]C匹配。
  • [a-z]c匹配。
  • [^?]*匹配其余部分。

答案 1 :(得分:0)

你也可以使用它们,它会使所有字母小写,然后你可以比较它

#include <iostream>
using std::cout;
using std::cin;

#include <string>
using std::string;

void toLowerCase(string &str)
{
    for (int i = 0; i < str.length(); i++)
    {
        str[i] = (char)tolower(str[i]);
    }
}

int main()
{
    string str1 = "Cat";
    string str2 = "cAT";

    toLowerCase(str1);
    toLowerCase(str2);

    cout << (str1 == str2);

    cin.ignore();
    return 0;
}