Bor*_*ens 2785 c# string contains case-insensitive
有没有办法让以下返回true?
string title = "ASTRINGTOTEST";
title.Contains("string");
Run Code Online (Sandbox Code Playgroud)
似乎没有一个过载允许我设置区分大小写.目前我大写它们两个,但这只是愚蠢(我指的是上下套管的i18n问题).
更新
这个问题是古老的,从那时起我就意识到,如果你想完全研究它,我会要求一个简单的答案来解决一个非常庞大和困难的话题.
对于大多数情况,在单语言的英语代码库中,这个答案就足够了.我怀疑是因为大多数人来到这个类别这是最受欢迎的答案.然而,
这个答案提出了一个固有的问题,即我们无法比较文本不区分大小写,直到我们知道两个文本是相同的文化并且我们知道文化是什么.这可能是一个不太受欢迎的答案,但我认为它更正确,这就是为什么我这样标记它.
Jar*_*Par 2618
您可以使用String.IndexOf方法并将其StringComparison.OrdinalIgnoreCase作为要使用的搜索类型传递:
string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
Run Code Online (Sandbox Code Playgroud)
更好的是为字符串定义一个新的扩展方法:
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source?.IndexOf(toCheck, comp) >= 0;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,对于旧版本,C#6.0(VS 2015)可以使用空传播 ?.
if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;
Run Code Online (Sandbox Code Playgroud)
用法:
string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
Col*_*nic 1315
测试字符串是否paragraph包含字符串word(感谢@QuarterMeister)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
Run Code Online (Sandbox Code Playgroud)
描述文本所用语言culture的实例在哪里CultureInfo.
这种解决方案对于不区分大小写的定义是透明的,这种定义与语言有关.例如,英语使用字符I和i第九个字母的大写和小写版本,而土耳其语使用这些字符作为其29个字母长字母的第11和第12个字母.土耳其大写版本的'i'是不熟悉的角色'İ'.
因此,串tin并TIN是同一个词在英语,但不同的词在土耳其.据我所知,一个是"精神",另一个是拟声词.(土耳其人,请纠正我,如果我错了,或建议一个更好的例子)
总而言之,如果您知道文本所使用的语言,则只能回答"这两个字符串是否相同但在不同情况下" 的问题.如果你不知道,你将不得不采取行动.鉴于英语在软件方面的霸权,你应该诉诸于此CultureInfo.InvariantCulture,因为以熟悉的方式会出错.
mkc*_*ler 220
你可以IndexOf()像这样使用:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// The string exists in the original
}
Run Code Online (Sandbox Code Playgroud)
由于0(零)可以是索引,因此请检查-1.
如果找到该字符串,则从零开始的索引位置值,如果不是,则返回-1.如果value为String.Empty,则返回值为0.
Jed*_*Jed 138
使用Regex的替代解决方案:
bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)
Ed *_* S. 77
您可以先将字符串向上或向下放大.
string title = "string":
title.ToUpper().Contains("STRING") // returns true
Run Code Online (Sandbox Code Playgroud)
哎呀,刚看到最后一点.不区分大小写的比较可能*会*做同样的事情,如果性能不是问题,我没有看到创建大写副本和比较它们的问题.我曾经发誓我曾经看过一次不区分大小写的比较...
小智 51
答案的一个问题是,如果字符串为null,它将抛出异常.您可以将其添加为支票,因此不会:
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;
}
Run Code Online (Sandbox Code Playgroud)
tak*_*ala 37
这很简洁.
Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
Run Code Online (Sandbox Code Playgroud)
Mat*_*nda 36
从2.0版开始,.NET Core有一对处理这个问题的方法:
例:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,他们可能会进入.NET标准,并从那里进入基类库的所有其他实现.
And*_*rew 35
StringExtension类是前进的方法,我结合上面的几个帖子给出了一个完整的代码示例:
public static class StringExtensions
{
/// <summary>
/// Allows case insensitive checks
/// </summary>
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
}
Run Code Online (Sandbox Code Playgroud)
Fab*_*ler 27
OrdinalIgnoreCase,CurrentCultureIgnoreCase还是InvariantCultureIgnoreCase?
由于缺少这个,这里有一些关于何时使用哪一个的建议:
StringComparison.OrdinalIgnoreCase的比较作为默认的安全文化无关的字符串匹配.StringComparison.OrdinalIgnoreCase比较来提高速度.StringComparison.CurrentCulture-based向用户显示输出时使用字符串操作.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
}
Run Code Online (Sandbox Code Playgroud)
而[YourDecision]取决于上述建议.
来源链接:http://msdn.microsoft.com/en-us/library/ms973919.aspx
Pra*_*nka 18
简单而有效
title.ToLower().Contains("String".ToLower())
Run Code Online (Sandbox Code Playgroud)
小智 15
这些是最简单的解决方案.
按索引
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// contains
}
Run Code Online (Sandbox Code Playgroud)通过改变案例
string title = "STRING";
bool contains = title.ToLower().Contains("string")
Run Code Online (Sandbox Code Playgroud)通过Regex
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)ser*_*hio 11
我知道这不是C#,但在框架(VB.NET)中已经存在这样的功能
Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")
Run Code Online (Sandbox Code Playgroud)
C#变种:
string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");
Run Code Online (Sandbox Code Playgroud)
Cas*_*sey 11
InStr如果您对国际化有所顾虑(或者您可以重新实现),那么VisualBasic程序集中的方法是最好的.在它看来dotNeetPeek显示它不仅占大写字母和小写字母,而且还包括假名类型和全角度与半宽字符(主要与亚洲语言相关,尽管罗马字母也有全宽版本) ).我正在跳过一些细节,但查看私有方法InternalInStrText:
private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
int num = sSrc == null ? 0 : sSrc.Length;
if (lStartPos > num || num == 0)
return -1;
if (sFind == null || sFind.Length == 0)
return lStartPos;
else
return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}
Run Code Online (Sandbox Code Playgroud)
cdy*_*oby 11
像这样:
string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
Console.WriteLine("yes");
}
Run Code Online (Sandbox Code Playgroud)
小智 10
用这个:
string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)
das*_*der 10
您可以使用字符串比较参数(可从 .net 2.1 及更高版本获得) String.Contains Method。
public bool Contains (string value, StringComparison comparisonType);
Run Code Online (Sandbox Code Playgroud)
例子:
string title = "ASTRINGTOTEST";
title.Contains("string", StringComparison.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
小智 7
使用RegEx是一种直接的方法:
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)
只是为了建立这里的答案,您可以创建一个字符串扩展方法,使其更加用户友好:
public static bool ContainsIgnoreCase(this string paragraph, string word)
{
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
这与此处的其他示例非常相似,但我决定将枚举简化为bool,primary,因为通常不需要其他替代方法.这是我的例子:
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, bool bCaseInsensitive )
{
return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0;
}
}
Run Code Online (Sandbox Code Playgroud)
用法如下:
if( "main String substring".Contains("SUBSTRING", true) )
....
Run Code Online (Sandbox Code Playgroud)
如果你想检查你传递的字符串是否在字符串中,那么有一个简单的方法。
string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";
bool isContained = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;
Run Code Online (Sandbox Code Playgroud)
如果包含或不包含字符串,则此布尔值将返回
小智 5
与之前的答案类似(使用扩展方法),但有两个简单的 null 检查(C# 6.0 及更高版本):
public static bool ContainsIgnoreCase(this string source, string substring)
{
return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
如果 source 为 null,则返回 false(通过 null 传播运算符 ?.)
如果子字符串为空,则视为空字符串并返回 true(通过空合并运算符??)
如果需要,当然可以将 StringComparison 作为参数发送。
评分最高的几个答案都以各自的方式都很好且正确,我写在这里是为了添加更多信息、背景和观点。
\n为了清楚起见,让我们考虑如果 A 中存在等于 B 的任何代码点子序列,则字符串 A 包含字符串 B。如果我们接受这一点,那么问题就简化为两个字符串是否相等的问题。
\n几十年来,人们一直在详细考虑字符串何时相等的问题。目前的大部分知识都封装在 SQL 排序规则中。Unicode 范式接近于此的真子集。但除了 SQL 排序规则之外,还有更多内容。
\n例如,在 SQL 排序规则中,您可以
\n严格二进制敏感- 以便不同的 Unicode 规范化形式(例如预组合或组合重音)进行不同的比较。
\n例如,\xc3\xa9可以表示为U+00e9(预组合)或U+0065 U+0301(e 与组合锐音符)。
这些是相同还是不同?
\nUnicode 规范化- 在这种情况下,上述示例将彼此相等,但不等于\xc3\x89或e。
不区分重音(例如西班牙语、德语、瑞典语等文本)。在这种情况下U+0065===U+0065 U+0301U+00e9\xc3\xa9 =e
大小写和重音不敏感,因此(例如西班牙语、德语、瑞典语等文本)。在这种情况下U+00e9= U+0065 U+0301= U+00c9= U+0045 U+0301= U+0049= U+0065= E= e=\xc3\x89 =\xc3\xa9
假名类型敏感或不敏感,即您可以将日语平假名和片假名视为等同或不同。这两个音节包含相同数量的字符,以(大部分)相同的方式组织和发音,但书写方式不同并且用于不同的目的。例如,片假名用于外来词或外国名字,但平假名用于儿童读物、发音指南(例如红宝石),以及单词没有汉字的情况(或者作者可能不知道汉字的情况) ,或者认为读者可能不知道)。
\n全角或半角敏感- 由于历史原因,日语编码包括某些字符的两种表示形式 - 它们以不同的尺寸显示。
\n连字被视为等效或不等效:参见https://en.wikipedia.org/wiki/Ligature_(writing)
\n是\xc3\xa6相同的ae还是不一样?它们具有不同的 Unicode 编码,重音字符也是如此,但与重音字符不同的是,它们看起来也不同。
这让我们...
\n阿拉伯语表示形式等效
\n阿拉伯文字具有优美的书法文化,相邻字母的特定序列具有特定的表示形式。其中许多已在 Unicode 标准中进行编码。我不完全理解这些规则,但在我看来它们类似于连字。
\n其他文字和系统:我对卡纳达语、马拉雅拉姆语、僧伽罗语、泰语、古吉拉特语、藏语或几乎所有未提及的数十或数百种文字一无所知。我认为他们对于程序员来说也有类似的问题,并且考虑到到目前为止提到的问题数量和如此少的脚本,他们可能还有程序员应该考虑的其他问题。
\n这让我们摆脱了“编码”的困境。
\n现在我们必须进入杂草的“意义”。
\n等于?Beijing \xe5\x8c\x97\xe4\xba\xac如果不是,则B\xc4\x95ij\xc4\xabng等于\xe5\x8c\x97\xe4\xba\xac?如果没有,为什么不呢?这是拼音罗马化。
等于?Peking \xe5\x8c\x97\xe4\xba\xac如果没有,为什么不呢?这是 Wade-Giles 罗马化。
等于?Beijing Peking如果没有,为什么不呢?
你为什么要这样做?
\n例如,如果您想知道两个字符串(A 和 B)是否可能指代相同的地理位置或同一个人,您可能想问:
\n这些字符串可能是一组汉字序列的 Wade-Giles 或拼音表示形式吗?如果是,对应的集合之间是否有重叠?
\n这些字符串之一可能是汉字的西里尔字母转录吗?
\n这些字符串之一可能是拼音罗马化的西里尔字母音译吗?
\n这些字符串之一可能是英文名称汉化拼音罗马化的西里尔字母音译吗?
\n显然,这些都是难题,没有明确的答案,而且无论如何,根据问题的目的,答案可能会有所不同。
\n最后用一个具体的例子来结束。
\nBeijing、Peking、B\xc4\x95ij\xc4\xabng和\xe5\x8c\x97\xe4\xba\xac都是相等的。为了这个目的,他们都同样优秀。毫无疑问,中国邮局承认许多其他选择,例如P\xc3\xa9kin法语、Pequim葡萄牙语、B\xe1\xba\xafc Kinh越南语和\xd0\x91\xd1\x8d\xd1\x8d\xd0\xb6\xd0\xb8\xd0\xbd蒙古语。词语没有固定的含义。
\n语言是我们用来探索世界、完成任务以及与他人交流的工具。
\n虽然看起来像equality、Beijing、 或 这样的词会很有帮助meaning的词有固定的含义会很有帮助,但可悲的事实是它们没有。
但我们似乎还是得过且过。
\n长话短说:如果你正在处理与现实相关的问题,那么在所有的模糊性(模糊性、不确定性、缺乏清晰的界限)中,每个问题基本上都有三种可能的答案:
\n| 归档时间: |
|
| 查看次数: |
825311 次 |
| 最近记录: |