我有以下条件要检查字符串:
123
,N123
,{{1} },123N
。错误:12N3
,N123N
)到目前为止,我已尝试过以下内容。它非常接近,只有第一条测试线(如下所示)没有返回预期的结果。我不太清楚为什么会这样。我想我必须忽略一些东西。
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;
}
奖金:有没有简洁的方法来简化任何正则表达式?或者将所有条件放在一起似乎很混乱。
答案 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
,因为它已被注释,或删除注释并将它们连接在一起。 这是上述模式所需的唯一选项。
这是针对上述所有案例进行测试的,它们的行为符合预期。但我猜你会有边缘情况,可能需要新的负面展望或根据需要进行调整。
由于边缘情况的这种性质,我不会解决任何新的边缘情况,请使用我上面的示例作为模式作为所需内容的起点。