我需要确定字符串是否包含无效字符。标准是,它只能包含[a-z]
,[A-Z]
,[0-9]
和[/,.-\]
字符,并且其他任何内容都是无效。此外,字符,后跟空格,然后是/,然后是空格,然后是字符,也是有效。我在下面使用的正则表达式可以满足第一个条件,但是我正在努力处理第二个条件。我尝试了很多组合,类似的方法,但没有成功。
public bool ContainsInvalidChars(string s)
{
return new Regex(@"[^a-zA-Z0-9/,.-][@"\s/\s"]).IsMatch(s);
}
Examples of input strings:
below is Valid
CSU,USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM
below is invalid
CSU,USD,6230.67,705RA0 /2YKMP,5/11/2020,5/11/2020,VM
below is invalid
CSU, USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
您可以使用字符类,并在以空格/
开始的组中再重复0次以上,然后再重复字符类。
^[a-zA-Z0-9/,.-]+(?: / [a-zA-Z0-9/,.-]+)*$
代码可能类似于
public bool ContainsInvalidChars(string s)
{
return new Regex(@"^[a-zA-Z0-9/,.-]+(?: / [a-zA-Z0-9/,.-]+)*$").IsMatch(s);
}
答案 1 :(得分:0)
您有两种有效的块:
[a-zA-Z0-9/,.-]
\s/\s
让它们任意组合(注意锚 ^
和$
-我们希望整个字符串匹配)
^(?:(?:\s/\s)*[a-zA-Z0-9/,.-]*)*$
最后,无效表示不匹配:
代码:
public static bool ContainsInvalidChars(string s) =>
!Regex.IsMatch(s, @"^(?:(?:\s/\s)*[a-zA-Z0-9/,.-]*)*$");
演示:
string[] tests = new string[] {
@"CSU,USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM",
@"CSU,USD,6230.67,705RA0 /2YKMP,5/11/2020,5/11/2020,VM",
@"CSU, USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM",
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,-60} :: {(ContainsInvalidChars(test) ? "Invalid" : "Valid")}"));
Console.Write(report);
结果:
CSU,USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM :: Valid
CSU,USD,6230.67,705RA0 /2YKMP,5/11/2020,5/11/2020,VM :: Invalid
CSU, USD,6230.67,705RA0 / 2YKMP,5/11/2020,5/11/2020,VM :: Invalid
答案 2 :(得分:0)
我建议使用
public bool ContainsInvalidChars(string s)
{
return Regex.IsMatch(s, @"(?!\s/\s)(?<!\s/(?=\s))[^a-zA-Z0-9/,.-]");
}
请参见regex demo
正则表达式详细信息
(?!\s/\s)
-不紧跟空格+ /
+空格的位置(?<!\s/(?=\s))
-不立即以空格+ /
开头的位置,然后是空格的后面[^a-zA-Z0-9/,.-]
-除ASCII字母,数字,/
,,
,.
或-
以外的任何字符。这两种环顾方法仅排除WHITESPACE + [^a-zA-Z0-9/,.-]
+ WHITESPACE块中的匹配空白(否则与/
匹配)。