C#字符串校验问题:EndsWith用法及特定点字符匹配需求
嘿,我来帮你搞定这两个字符串检查的问题,顺便把你之前代码里的坑填上~
需求1:检查字符串是否以“.后跟任意3个字符”结尾
首先得说清楚:EndsWith()方法只能匹配固定后缀,没法直接匹配“任意3个字符”,所以得换个思路,这里给你两种可行的方案:
方法1:结合Substring手动判断
先确保字符串长度至少4(毕竟“.xxx”是4个字符),然后取最后4位的第一个字符是“.”,剩下的三位只要存在就符合要求:
string myString = "www.stackoverflow.com"; // 先判断长度足够,再检查最后4位的首字符是点号 bool endsWithDotThree = myString.Length >= 4 && myString.Substring(myString.Length - 4, 1) == "."; Console.WriteLine(endsWithDotThree); // 这里会输出true,因为结尾是.com,符合条件
方法2:正则表达式(更简洁)
如果觉得手动截取麻烦,用正则的结尾锚定$来匹配格式,代码更直观:
using System.Text.RegularExpressions; string myString = "www.stackoverflow.com"; // \.转义匹配点号,.{3}匹配任意3个字符,$表示字符串结尾 bool endsWithDotThree = Regex.IsMatch(myString, @"\.{1}.{3}$"); Console.WriteLine(endsWithDotThree);
需求2:检查“.”前不是“www”,以及检查“.”前后有指定Y个字符
先修正你之前的代码错误
你之前写的!myString.Contains(".".StartsWith("www"))逻辑完全错啦!".".StartsWith("www")返回的是一个布尔值(肯定是false),但Contains()需要传入字符串,所以编译器才会报“无法将bool转换为string”的错误。用dynamic虽然编译过,但运行时会因为类型不匹配直接崩溃,这绝对不是正确的做法。
正确检查“.”前不是“www”的方法
方法1:通过索引定位判断
先找到字符串中点号的位置,再检查它前面的3个字符是不是“www”:
string myString = "www.stackoverflow.com"; int dotIndex = myString.IndexOf('.'); bool dotNotAfterWww = false; if (dotIndex != -1) // 先确保字符串里确实有“.” { // 如果点号的位置小于3,说明前面不够3个字符,肯定不是www;否则截取前面3个字符对比 dotNotAfterWww = dotIndex < 3 || myString.Substring(dotIndex - 3, 3) != "www"; } Console.WriteLine(dotNotAfterWww); // 这里第一个点号前面是www,所以输出false;如果是“abc.stack.com”,就会输出true
方法2:正则表达式(更优雅)
用正则的负向前瞻断言,直接匹配前面不是“www”的点号,代码更简洁:
using System.Text.RegularExpressions; string myString = "www.stackoverflow.com"; // (?!www)是负向前瞻:当前位置前面不能是www,然后匹配\.点号 bool dotNotAfterWww = Regex.IsMatch(myString, @"(?!www)\."); Console.WriteLine(dotNotAfterWww); // 这里第二个点号(.com的点)前面不是www,所以会输出true;如果字符串是“www.abc”,就会输出false
检查“.”前后有指定Y个字符的方法
假设你指定的字符数是Y(比如Y=3),要检查某个点号前面至少有Y个字符,后面也至少有Y个字符,两种方案:
方法1:索引定位判断
int Y = 3; string myString = "www.stackoverflow.com"; int dotIndex = myString.IndexOf('.'); bool hasYCharsAroundDot = false; if (dotIndex != -1) { // 前面有至少Y个字符:dotIndex >= Y;后面有至少Y个字符:总长度 - 点号索引 -1 >= Y hasYCharsAroundDot = dotIndex >= Y && (myString.Length - dotIndex - 1) >= Y; } Console.WriteLine(hasYCharsAroundDot); // 比如“abc.def”,Y=3时输出true;“ab.def”前面只有2个字符,输出false
方法2:正则表达式
用动态生成的正则模式,匹配前后各Y个字符的点号:
using System.Text.RegularExpressions; int Y = 3; string myString = "www.stackoverflow.com"; // 用{{Y}}转义大括号,生成匹配Y个字符+点号+Y个字符的模式 string pattern = $@".{{{Y}}}\.{{1}}.{{{Y}}}"; bool hasYCharsAroundDot = Regex.IsMatch(myString, pattern); Console.WriteLine(hasYCharsAroundDot);
注意:如果要检查整个字符串就是“Y个字符+点号+Y个字符”的格式,就在模式开头加^、结尾加$锚定,比如^.{{{Y}}}\.{{1}}.{{{Y}}}$。
内容的提问来源于stack exchange,提问作者Octavylon
相关产品推荐
相关产品推荐

