我遇到的问题是我只能使用一个Regex.IsMatch
来验证字符串,我必须使用正则表达式来匹配相同的字符串,我看起来似乎我可以使用正则表达式条件像(?(?=regex)then|else)
一样匹配字符串值上的正则表达式,但我无法达到相同的结果
我使用两个正则表达式验证的实际代码是:
bool flag = false;
if (Regex.IsMatch(alias, "^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$"))
{
if (Regex.IsMatch(alias, "[^0-9.-]+"))
{
flag = true;
};
};
我想要实现的是这样的:
if (Regex.IsMatch(alias, "(?(^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$)([^0-9.-]+))"))
{
// Some code...
};
所以,如果你能给我一些指导,或者检查我的正则表达式是否正确使用regexp中的条件,那么会很感激
答案 0 :(得分:2)
你的第一个正则表达式:
^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$
表示允许0-9.-,而第二个表示0-9.-是不允许的。为什么不将第一个更改为:
^[a-zñA-ZÑ_]{6}[a-zñA-ZÑ_]*$
甚至更简单:
^[a-zñA-ZÑ_]{6,}$
因为两个部分相等
[编辑 - 代码示例]
艾伦的回答可能是最优雅的,但你也可以这样做:
bool flag = false;
Match m = Regex.Match(alias, "(?<main>^[a-zñA-ZÑ_0-9-.]{6,}$)|(?<char>[^0-9.-])");
if (m.Groups["main"].Success && m.Groups["char"].Success)
{
flag = true;
};
也就是说,将正则表达式分解成几个部分通常会更好。它使它更具可读性,每个表达式都做一件事。只要你不是每秒执行一百万次表达式,运行几个Regexp的开销就是微不足道的。
答案 1 :(得分:2)
你需要的是一个先行,而不是条件。观察:
^(?=.*[a-zñA-ZÑ_])[a-zñA-ZÑ_0-9.-]{6,}$
前瞻 - (?=.*[a-zñA-ZÑ_])
- 断言字符串中至少有一个列出的字符。完成后,匹配位置将返回到字符串的开头,因此“真正的”正则表达式可以匹配整个事物。
有关前瞻的更多信息:http://www.regular-expressions.info/lookaround.html