问:

有没有办法使以下返回为真?

string title = "ASTRINGTOTEST";
title.Contains("string");

似乎没有允许我设置区分大小写的过载。目前我将它们都大写,但这很愚蠢(我指的是上下大小写带来的 i18n 问题)。

更新

这个问题很古老,从那时起,我意识到如果您愿意全面调查,我会要求一个非常广泛而困难的主题的简单答案。

在大多数情况下,在单语英语代码库中,this 答案就足够了。我怀疑是因为大多数来这里的人都属于这一类,这是最受欢迎的答案。

This 但答案带来了一个固有问题,即我们无法比较不区分大小写的文本,除非我们知道两个文本是相同的文化并且我们知道该文化是什么。这可能是一个不太受欢迎的答案,但我认为它更正确,这就是我将其标记为这样的原因。

答1:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

您可以使用 String.IndexOf Method 并将 StringComparison.OrdinalIgnoreCase 作为要使用的搜索类型:

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

更好的是为字符串定义一个新的扩展方法:

public static class StringExtensions
{public static bool Contains(this string source, string toCheck, StringComparison comp){return source?.IndexOf(toCheck, comp) >= 0;}
}

请注意,null propagation ?. 自 C# 6.0 (VS 2015) 起可用,对于旧版本使用

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

用法:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);

很棒的字符串扩展方法!我已经编辑了我的以检查源字符串不为空,以防止在执行 .IndexOf() 时发生任何对象引用错误。

这给出了与 paragraph.ToLower(culture).Contains(word.ToLower(culture)) 和 CultureInfo.InvariantCulture 相同的答案,但它不能解决任何本地化问题。为什么要把事情复杂化? stackoverflow.com/a/15464440/284795

@ColonelPanic ToLower 版本包括 2 个分配,这在比较/搜索操作中是不必要的。为什么在不需要的场景中进行不必要的分配?

@Seabiscuit 不起作用,因为 string 是 IEnumerable 因此您不能使用它来查找子字符串

一个警告:string.IndexOf(string) 的默认值是使用当前文化,而 string.Contains(string) 的默认值是使用序数比较器。众所周知,前者可以通过选择更长的过载来改变,而后者不能改变。这种不一致的结果是以下代码示例:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */

答2:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

测试字符串 paragraph 是否包含字符串 word(感谢@QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

其中 culture 是描述文本所用语言的 CultureInfo 实例。

此解决方案对于不区分大小写的定义是透明的,这取决于语言。例如,英语将字符 I 和 i 用于第九个字母的大写和小写版本,而土耳其语将这些字符用于其 29 个字母长的字母表中的 eleventh and twelfth letters。土耳其语大写版本的“i”是不熟悉的字符“İ”。

因此,字符串 tin 和 TIN 是相同的单词 英语,但不同的单词 土耳其语。据我了解,一个意思是“精神”,另一个是象声词。 (土耳其人,如果我错了,请纠正我,或者提出一个更好的例子)

总而言之,您只能回答“这两个字符串是否相同但在不同情况下”的问题如果您知道文本的语言。如果你不知道,你将不得不采取一个平底船。鉴于英语在软件方面的霸权,您可能应该求助于 CultureInfo.InvariantCulture,因为它会以熟悉的方式出错。

为什么不culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0?它使用正确的文化并且不区分大小写,它不分配临时的小写字符串,并且避免了转换为小写和比较是否总是与不区分大小写的比较相同的问题。

该解决方案还通过为应该是搜索功能的分配内存来不必要地污染堆

当两个不同的字母具有相同的小写字母时,与 ToLower() 比较将给出与不区分大小写的 IndexOf 不同的结果。例如,在 U+0398“希腊大写字母 Theta”或 U+03F4“希腊大写字母 Theta 符号”上调用 ToLower() 会导致 U+03B8,“希腊小写字母 Theta”,但大写字母被认为是不同的。两种解决方案都考虑了相同大写字母的小写字母不同,例如 U+0073 "Latin Small Letter S" 和 U+017F "Latin Small Letter Long S",因此 IndexOf 解决方案似乎更加一致。

@Quartermeister - 顺便说一句,我相信 .NET 2 和 .NET4 在这方面的表现不同,因为 .NET 4 总是使用 NORM_LINGUISTIC_CASING 而 .NET 2 没有(这个标志出现在 Windows Vista 中)。

你为什么不写 "ddddfg".IndexOf("Df", StringComparison.OrdinalIgnoreCase) ?

答3:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

您可以像这样使用 IndexOf():

string title = "STRING";if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{// The string exists in the original
}

由于 0(零)可以是一个索引,因此您检查 -1。

MSDN

如果找到该字符串,则 value 的从零开始的索引位置,否则为 -1。如果 value 为 String.Empty,则返回值为 0。

答4:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

使用正则表达式的替代解决方案:

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);

好主意,如果有帮助,我们在 RegexOptions 中也有很多位组合,例如 RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;。

必须说我更喜欢这种方法,尽管使用 IsMatch 是为了整洁。

更糟糕的是,由于搜索字符串被解释为正则表达式,因此许多标点字符会导致不正确的结果(或由于表达式无效而引发异常)。尝试在 "This is a sample string that doesn't contain the search string" 中搜索 "."。或者尝试搜索 "(invalid"。

@cHao:在这种情况下,Regex.Escape 可能会有所帮助。当 IndexOf / extension Contains 很简单(并且可以说更清晰)时,Regex 似乎仍然没有必要。

请注意,我并不是暗示这个 Regex 解决方案是最好的方法。我只是添加到原始发布问题的答案列表中“有没有办法使以下返回为真?”。

答5:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

.NET Core 2.0+(包括 .NET 5.0+)

自 2.0 版以来,.NET Core 有两种方法来处理这个问题:

String.Contains(Char, StringComparison)

String.Contains(字符串,字符串比较)

例子:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

它现在正式成为 .NET Standard 2.1 的一部分,因此是实现此版本标准(或更高版本)的基类库的所有实现的一部分。

现在也可用于 .NET Standard 2.1

在 .NET 5.0 中也可用。

.NET 5.0 包含在“.NET Core 2.0+”中

答6:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

您总是可以先将字符串向上或向下转换。

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

哎呀,刚刚看到最后一点。无论如何,不区分大小写的比较可能会做同样的事情,如果性能不是问题,我认为创建大写副本并比较它们没有问题。我可以发誓我曾经看过一次不区分大小写的比较…

搜索“土耳其测试”:)

在某些法语语言环境中,大写字母没有变音符号,因此 ToUpper() 可能并不比 ToLower() 好。如果可用的话,我会说使用适当的工具 - 不区分大小写的比较。

不要使用 ToUpper 或 ToLower,按照 Jon Skeet 所说的去做

两年后再次看到这一点,并再次投下反对票……无论如何,我同意有更好的方法来比较字符串。但是,并非所有程序都会本地化(大多数不会),而且许多程序是内部应用程序或一次性应用程序。因为我几乎不能指望为一次性应用程序留下最好的建议......我继续前进:D

搜索“土耳其测试”是否与搜索“土耳其测试”相同?

答7:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

答案的一个问题是,如果字符串为空,它将引发异常。您可以将其添加为支票,这样它就不会:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))return true;return source.IndexOf(toCheck, comp) >= 0;
} 

如果 toCheck 是空字符串,则它需要根据包含文档返回 true:“如果 value 参数出现在此字符串中,或者如果 value 是空字符串 (""),则为 true;否则为 false。”

根据上面amurra的评论,建议的代码不需要更正吗?不应该将此添加到已接受的答案中,以便首先获得最佳响应吗?

现在,如果 source 是空字符串或 null 无论 toCheck 是什么,这将返回 true。那不可能是正确的。如果 toCheck 是一个空字符串并且 source 不为空,IndexOf 也已经返回 true。这里需要的是检查空值。我建议 if (source == null || value == null) return false;

源不能为空

if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);

答8:

huntsbot.com – 高效赚钱,自由工作

StringExtension 类是前进的方向,我结合上面的几篇文章给出了一个完整的代码示例:

public static class StringExtensions
{/// /// Allows case insensitive checks/// public static bool Contains(this string source, string toCheck, StringComparison comp){return source.IndexOf(toCheck, comp) >= 0;}
}

你为什么要在 StringComparison 上允许另一个抽象层?

因为这简化了代码的读取和编写。它本质上是在模仿 .Net 的更高版本直接添加到类中的内容。对于使您和他人的生活更轻松的简单便捷方法,有很多话要说,即使它们确实增加了一点抽象。

答9:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

这是干净和简单的。

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)

不过,这将与模式匹配。在您的示例中,如果 fileNamestr 有任何特殊的正则表达式字符(例如 *、+、. 等),那么您会大吃一惊。使此解决方案像正确的 Contains 函数一样工作的唯一方法是通过执行 Regex.Escape(fileNamestr) 来转义 fileNamestr。

此外,解析和匹配正则表达式比简单的不区分大小写的比较更耗费资源

答10:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

OrdinalIgnoreCase、CurrentCultureIgnoreCase 还是 InvariantCultureIgnoreCase?

由于缺少此功能,因此以下是有关何时使用哪一个的一些建议:

多斯

使用 StringComparison.OrdinalIgnoreCase 进行比较,作为与文化无关的字符串匹配的安全默认值。

使用 StringComparison.OrdinalIgnoreCase 比较来提高速度。

在向用户显示输出时使用基于 StringComparison.CurrentCulture 的字符串操作。

当比较在语言上不相关(例如,符号)时,切换当前使用基于不变区域性的字符串操作以使用非语言 StringComparison.Ordinal 或 StringComparison.OrdinalIgnoreCase。

在规范化字符串进行比较时,使用 ToUpperInvariant 而不是 ToLowerInvariant。

不要做

对未显式或隐式指定字符串比较机制的字符串操作使用重载。

大多数情况下使用基于 StringComparison.InvariantCulture 的字符串操作;少数例外之一是保留具有语言意义但与文化无关的数据。

根据这些规则,您应该使用:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{// The string exists in the original
}

而 [YourDecision] 取决于上面的建议。

来源链接:http://msdn.microsoft.com/en-us/library/ms973919.aspx

如果你知道你总是会得到一个英文字符串怎么办。使用哪一个?

@BKSpureon 如果大小写无关紧要,我会使用 OrdinalIgnoreCase

为什么我们更喜欢 ToUpperInvariant 而不是 ToLowerInvariant?

没关系知道为什么docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/…

答11:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

这些是最简单的解决方案。

按字符串标题索引 = “STRING”; if (title.IndexOf(“string”, 0, StringComparison.CurrentCultureIgnoreCase) != -1) { // contains } 通过更改大小写 string title = “STRING”; bool contains = title.ToLower().Contains(“string”) 通过正则表达式 Regex.IsMatch(title, “string”, RegexOptions.IgnoreCase);

原文链接:https://www.huntsbot.com/qa/4lQ9/case-insensitive-containsstring?lang=zh_CN&from=csdn

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

不区分大小写的“包含(字符串)”相关推荐

  1. linux tail 查找字符串,linux 查找包含字符串的文件

    1. 前言 本文主要讲解如何在Linux系统下查找包含指定字符串的文件和搜索相关关键字. 2. linux 查找包含字符串的文件相关实用案例 使用find命令查找文件,并把查找结果重定向至grep程序 ...

  2. 检查字段是否包含字符串

    本文翻译自:Checking if a field contains a string I'm looking for an operator, which allows me to check, i ...

  3. css3选择器的比较(二) -- 包含字符串

    广播: 关注微信公众号 "jQuery每日经典" ,有更多资料.微信小程序 -- 前端技术API手册 也在公众号首次发布.有需要的联系公众号中QQ. 二.  包含"字符串 ...

  4. 51 nod 1127最短的包含字符串(尺取法)

    1127 最短的包含字符串   收藏  关注 给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度.如果给出的字符串中并不包括A-Z中的全 ...

  5. mysql against包含英文_在MySQL中使用MATCH和AGAINST选择特定列中包含字符串的行

    让我们首先创建一个表-mysql> create table DemoTable1833 ( Name varchar(20) ); 修改表-Mysql> alter table Demo ...

  6. mysql查询包含字符串(模糊查询)

    mysql查询包含字符串更高效率的方法一.LOCATE语句SELECT `column` from `table` where locate('keyword', `condition`)>0二 ...

  7. 让mysql中行的值拼接_在MySQL中行值包含字符串的SELECT?

    要在MySQL中选择包含字符串的行值,请使用以下语法.SELECT *FROM yourTableName where yourColumnName like '%yourPattern%'; 为了理 ...

  8. 51 32单片机使用蓝牙测RSSI值定位(包含字符串发送,接收字符串,数据解析发送,中断超时接收等)

    首先这是一篇血泪文章,当你看到这篇文章的时候,笔者已经失败了,首先笔者选用了51单片机进行编写,51单片机的一个串口难以进行相应的验证,这是其一:其二,使用AT+CWLAP调回WIFI信息的时候,你会 ...

  9. Swift 5 判断数组中是否包含字符串,忽略大小写

    系统: Mac OS 10.15.2, XCode 11.3,swift 5.0 写作时间:2020-01-08 说明 Swift 5 判断数组中是否包含字符串,忽略大小写 let list = [& ...

最新文章

  1. 37.数字在排序数组出现的次数
  2. 思科路由器NAT配置详解(转)
  3. 实用金属材料手册_机械密封选用手册
  4. tukey检测_回到数据分析的未来:Tukey真空度的整洁实现
  5. Ubuntu将在明年推出平板及手机系统
  6. [设计模式] ------ 装饰模式
  7. 什么是Apache Spark?这篇文章带你从零基础学起
  8. BZOJ3522[Poi2014]Hotel——树形DP
  9. 25+ 个单色背景的网页设计实例
  10. ImageMagick 安装 window10与错误总结
  11. 英语一窍不通能学计算机吗,对英语一窍不通怎么学有什么好的方法
  12. 39页第五题计算数列之和
  13. 资源调度_提前计划+实时调度,实现月台资源高效利用
  14. 华为网络技术大赛笔记——存储器基础原理
  15. thinkphp5json对象转数组
  16. 深度学习之学习(3-4)YOLOV4
  17. python可视化之matplotlib绘图--蜘蛛侠钢铁侠(组合分区绘图)
  18. 当图片被压缩时,图片变得模糊
  19. TIOBE 11 月编程语言:Java 首次跌出前二;基于Pytorch的Kornia可微分计算机视觉库开源...
  20. P3647 [APIO2014]连珠线

热门文章

  1. 医院门诊和挂号系统的操作指南
  2. ISP Tuning之路:初识ADRC
  3. Windows10 镜像(正版和原版)
  4. 安装OYO 24 绘图仪 IKON 驱动安装
  5. Springboot定时器——cron表达式规则
  6. 【雕刻机】Grbl程序使用入门
  7. 对Windows10虚拟桌面的简单研究
  8. 如何打开ESRI ArcGIS的LPK文件(layer package)
  9. 计算机二级vf上机题库,计算机二级VF上机题库
  10. arm9 mini2440 supervivi烧写方法