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 :(得分: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
$