如何高效检查字符串是否包含带st/nd/rd/th后缀的数字?
解决方案
直接用正则表达式就能一次性搞定,比你现在写一堆Contains高效多了,还能避免各种误判。
正则匹配逻辑
首先得理清数字后缀的规则:
- 11、12、13不管末尾数字,都用
th - 末尾是1的数字(除了11)用
st - 末尾是2的数字(除了12)用
nd - 末尾是3的数字(除了13)用
rd - 其他数字全用
th
对应的正则表达式(支持忽略大小写):
\b(?:1[1-3]th|[02-9]1st|[02-9]2nd|[02-9]3rd|\d+(?<!1[1-3])th)\b
关键部分解释:
\b:匹配单词边界,防止误判类似5thx这种带多余字符的情况1[1-3]th:专门覆盖11th、12th、13th这三个例外场景[02-9]1st:匹配21st、31st这类(自动排除错误的11st)\d+(?<!1[1-3])th:匹配所有非11/12/13的数字加th组合
C# 代码实现
直接封装成方法即可使用:
using System.Text.RegularExpressions; public bool HasValidNumberSuffix(string address) { var pattern = @"\b(?:1[1-3]th|[02-9]1st|[02-9]2nd|[02-9]3rd|\d+(?<!1[1-3])th)\b"; return Regex.IsMatch(address, pattern, RegexOptions.IgnoreCase); }
测试验证
用你给出的示例测试,结果完全符合预期:
12th→ true3rd→ trueSmith→ false11th ST→ true5→ false21st→ true
优势对比
和你原来的方法相比:
- 代码更简洁:不用写一堆重复的
Contains判断 - 效率更高:一次字符串扫描完成匹配,避免反复遍历
- 准确性更强:通过单词边界避免了部分匹配的错误(比如原方法会误判
1STabc为符合条件,正则不会)
内容的提问来源于stack exchange,提问作者DaBeau96
相关产品推荐
相关产品推荐

