正则表达式为非连续大写小写

时间:2017-03-20 12:09:53

标签: c++ regex

std::string s("AAA");
std::smatch m;
std::regex e("(?=.{3,}[A-Z])(?=.{0,}[a-z]).*");
output = std::regex_search(s, m, e);

这里应该有3个或更多的大写字母和零个或多个小写字母。 但输出为零意味着它失败。当我尝试用1替换零时 s(" AAA4")它工作正常。

所以现在我希望它允许零或更多,但似乎它不接受零 我甚至尝试过量词(*),相当于{0,}仍然不起作用。

以下是一个例子:

string1 "AAA"
string2 "AAAb"
string3 "AbAA"

以下正则表达式适用于string1和string2,因为大写是连续的:

[A-Z]{3,}[a-z]*

以下正则表达式适用于string2和string3,但即使我指定了0,它也不会有小写。

(?=.{3,}[A-Z])(?=.{0,}[a-z]).*

我正在寻找的是与以下案例一起使用所有这些的正则表达式:

  • 允许0次或更多次出现小写
  • 在字符串中验证3个大写但不必像字符串3
  • 那样连续

2 个答案:

答案 0 :(得分:1)

  

这里应该有3个或更多的大写字母和零个或多个小写字母。

你的(?=.{3,}[A-Z])(?=.{0,}[a-z]).*正则表达式匹配由0+个字符(.*)组成的行的一部分,该字符串以3个或更多个字符开头,后跟一个大写的ASCII字母((?=.{3,}[A-Z])),并且至少有一个小写的ASCII字母((?=.{0,}[a-z]))。

要匹配包含 x 大写ASCII字母和 y 小写ASCII字母的字符串,您需要使用

std::regex e("^(?=(?:[^A-Z]*[A-Z]){x}[^A-Z]*$)(?=(?:[^a-z]*[a-z]){y}[^a-z]*$)");
                                   ^                              ^

请参阅regex demo

<强>详情:

  • ^ - 字符串的开头
  • (?=(?:[^A-Z]*[A-Z]){x}[^A-Z]*$) - 在字符串开头触发的正向前瞻1并检查是否有 x 序列
    • [^A-Z]* - 除大写ASCII字母以外的零个或多个字符
    • [A-Z] - 一个大写的ASCII字母
    • [^A-Z]*$ - 除了大写ASCII字母以外的零个或多个字符,直到字符串的末尾($
  • (?=(?:[^a-z]*[a-z]){y}[^a-z]*$) - 在字符串开头触发的正向前瞻2(因为前瞻是零宽度断言)并检查是否有 y 序列
    • [^a-z]* - 除小写ASCII字母以外的零个或多个字符
    • [a-z] - 小写ASCII字母
    • [^a-z]*$ - 除了小写ASCII字母之外的零个或多个字符,直到字符串末尾。

答案 1 :(得分:-1)

^(?=.*[a-z])(?=.{3,}[A-Z]).+$

<强>解释

^                  // the start of the string
(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.{3,}[A-Z])     // use positive look ahead to see if at least 3 upper case letter exists
.+                 // gobble up the entire string
$