C# 在字符串中匹配字母和字母数字单词时出现问题
我有以下条件要检查字符串:C# 在字符串中匹配字母和字母数字单词时出现问题,c#,regex,C#,Regex,我有以下条件要检查字符串: 包含至少一个字母单词 至少包含一个字母数字字 字母数字单词在任何位置最多只能有一个字母字符,其余必须是数字(例如:好:123,N123,123N,12N3。坏:N123N,NN123) 到目前为止,我已经尝试了以下方法。非常接近,只有第一条测试线(如下所示)没有返回预期结果。我不太清楚这是为什么。我想我一定是忽略了什么 public static bool ValidLine(string sLine) { //1+ a-z characters
- 包含至少一个字母单词
- 至少包含一个字母数字字
- 字母数字单词在任何位置最多只能有一个字母字符,其余必须是数字(例如:好:
,123
,N123
,123N
。坏:12N3
,N123N
)NN123
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;
}
以下是我的测试用例(和预期结果)。只有第一个似乎是问题(这让我怀疑整个模式;它返回false,尽管它应该被认为是有效的)
string[] sTests = {
"123 Fake AB", //true (NOTE: returning false?)
"123 ", //false (no alpha word)
"123ff bad xy", //false (alpha numeric has > 1 alpha char)
"this is bad too", //false (no alphanumeric)
"Good one 123 ", //true
"s345f 12d234 alpha", //true
" good st 13", //true
" ave po13", //false (alpha numeric has > 1 alpha char)
" 123", //false (no alpha word)
" 123d", //false (no alpha word)
" 123t test", //true
" 12r3 test" //true
};
奖金:是否有一种简洁的方法来简化任何正则表达式?或者将所有条件组合在一起似乎很混乱。您需要设置
IgnoreCase
来解决初始问题
但有一个建议是通过一个look aheads来检查具体规则,并停止使用负面look aheads来处理像这样的边缘情况
^ # 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
,因为它已被注释,或者删除注释并将其连接在一起。这是上述模式所需的唯一选项
这是测试与您的所有情况下,上述和他们的行为预期。但我猜你会有边缘的情况,可能需要新的负面看ahead或调整需要
由于边缘情况的这种性质,我将不处理任何新的边缘情况,请使用我上面的示例作为需要的起点。您的正则表达式区分大小写,并检查是否有小写单词,因此
Fake
和AB
都无法匹配。哦,我的上帝…@SebastianProske我有正则表达式在我的程序中的其他地方执行不区分大小写的删除操作,但在这里完全忽略了它--。我将进行一些更改并重新运行。@DangerZone不要删除帖子,让Sebastian将其作为答案发布并接受它。aaaaaan这就是问题所在。如果您想快速给出答案,我将接受。我只是更改了以下行:RegexmatchRegex=newregex(string.Format(@{0}.{1}.{1}.{0}),alphaRx,alphaNumRx,RegexOptions.IgnoreCase);
@DangerZone对于这样复杂的东西,你的测试用例太少了。你的评论中的“A”和“D”代表“alpha”和“digit”吗?@DangerZone,是的,我需要一个速记来区分注释部分,而不是说“大写字母和小写字母..”。-)