无法匹配字符串中的字母和字母数字单词

时间:2017-05-10 14:10:47

标签: c# regex

我有以下条件要检查字符串:

  • 至少包含一个字母
  • 包含至少一个字母数字字
  • 字母数字一词在任何位置都可以包含最多一个字母字符,其余字母必须为数字(例如好:123N123,{{1} },123N。错误:12N3N123N

到目前为止,我已尝试过以下内容。它非常接近,只有第一条测试线(如下所示)没有返回预期的结果。我不太清楚为什么会这样。我想我必须忽略一些东西。

NN123

以下是我的测试用例(以及预期结果)。只有第一个似乎是问题(这使我怀疑整个模式;虽然它应该被视为有效,但它会返回false。

public static bool ValidLine(string sLine)
{
    //1+ a-z characters
    string alphaRx = @"(\b[a-z]+\b)";
    //1+ numbers with up to 1 letter somewhere
    string alphaNumRx = @"(\b[a-z]?[0-9]+\b|\b[0-9]+[a-z]?\b|\b[0-9]+[a-z]?[0-9]+\b)";

    Regex matchRegex = new Regex(string.Format(@"{0}.*{1}|{1}.*{0}", alphaRx, alphaNumRx));
    return matchRegex.Match(sLine).Success;
}

奖金:有没有简洁的方法来简化任何正则表达式?或者将所有条件放在一起似乎很混乱。

1 个答案:

答案 0 :(得分:0)

您需要设置IgnoreCase来解决您的初始问题。

但建议是通过展望来检查具体规则,并停止对此类边缘情况的负向预测

^                                  # Anchor to start of string
(?=.*\d)                           # Somewhere in the string there is a digit
(?=.*[A-Za-z]{2,})                 # Somewhere in the string there is are a 2 char word
(?!.*\b[A-Za-z]+\d+[A-Za-z]{2,}\b) # Stop on ADAA
(?!.*\d+[A-Za-z]{2,}\b)            # Stop on DAA
(?!.*[A-Za-z]{2,}\d+\b)            # Stop on AAD for `NN123`
.+                                 # If we reach here, we have a valid match, so capture.
$                                  # Anchor to end

使用IgnorePatternWhiteSpace,因为它已被注释,或删除注释并将它们连接在一起。 这是上述模式所需的唯一选项。

这是针对上述所有案例进行测试的,它们的行为符合预期。但我猜你会有边缘情况,可能需要新的负面展望或根据需要进行调整。

由于边缘情况的这种性质,我不会解决任何新的边缘情况,请使用我上面的示例作为模式作为所需内容的起点。