string title = "ASTRINGTOTEST";
title.Contains("string");
似乎没有允许我设置区分大小写的重载。.目前,我使用大写他们两个,但这只是愚蠢的(我指的是上下壳体附带的i18n问题)。
UPDATE
这个问题很古老,从那时起我就意识到了我想为一个非常广泛且困难的主题提供一个简单的答案,如果您想全面研究它的话。
在大多数情况下,在单语的英语代码库中,此答案就足够了。我很怀疑,因为大多数来这里的人都属于这个类别,这是最受欢迎的答案。但是,这个答案提出了一个固有的问题,那就是我们无法区分不区分大小写的文本,直到我们知道两个文本是相同的文化并且我们知道这种文化是。这可能是一个不太受欢迎的答案,但是我认为它更正确,这就是为什么我将其标记为这样。
#1 楼
测试字符串paragraph
是否包含字符串word
(感谢@QuarterMeister)culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
其中
culture
是CultureInfo
的实例,用于描述文本的编写语言。该解决方案对于不区分大小写的定义是透明的,该定义取决于语言。例如,英语使用第九个字母的大写和小写形式的字符
I
和i
,而土耳其语使用29个字母长的字母的第11和第12个字母使用这些字符。土耳其语大写版本的“ i”是一个陌生的字符“İ”。因此,字符串
tin
和TIN
在英语中是相同的单词,但是在土耳其语中是不同的单词。据我了解,一种是“精神”,另一种是拟声词。 (特克斯,如果我错了,请纠正我,或者提出一个更好的例子)总而言之,如果您知道“这两个字符串相同但在不同情况下,这两个字符串是否相同”的问题文字使用的是哪种语言。如果您不知道,则必须平底锅。鉴于英语在软件方面的霸权,您可能应该诉诸
CultureInfo.InvariantCulture
,因为用熟悉的方式会出错。#2 楼
您可以使用String.IndexOf方法并将StringComparison.OrdinalIgnoreCase
作为要使用的搜索类型:string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
更好的是为string定义新的扩展方法:
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source?.IndexOf(toCheck, comp) >= 0;
}
}
请注意,空传播
?.
自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);
评论
很棒的字符串扩展方法!我已经编辑了我的代码,以检查源字符串不为null,以防止执行.IndexOf()时发生任何对象引用错误。
–理查德钱包
13年2月8日在10:48
这给出与段相同的答案。ToLower(culture).Contains(word.ToLower(culture))与CultureInfo.InvariantCulture并没有解决任何本地化问题。为什么事情太复杂了? stackoverflow.com/a/15464440/284795
–上校恐慌
13年3月17日在18:52
@ColonelPanic ToLower版本包括2个分配,这在比较/搜索操作中是不必要的。为什么在不需要的情况下不必要地分配?
– JaredPar
13年3月18日在16:09
@Seabiscuit无法工作,因为string是IEnumerable
– JaredPar
2014年11月6日17:55
提醒一下:string.IndexOf(string)的默认值是使用当前区域性,而string.Contains(string)的默认值是使用顺序比较器。众所周知,前者可以更改为更长的过载,而后者不能更改。这种不一致的结果是以下代码示例:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;字符串self =“ Waldstrasse”;字符串值=“straße”; Console.WriteLine(self.Contains(value)); / * False * / Console.WriteLine(self.IndexOf(value)> = 0); / * True * /
–Jeppe Stig Nielsen
16年2月18日在9:40
#3 楼
您可以像这样使用IndexOf()
:string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// The string exists in the original
}
由于0(零)可以是索引,因此请检查-1。
MSDN
如果找到该字符串,则从零开始的索引位置,否则为-1
。如果value为String.Empty,则返回值为0。
#4 楼
使用Regex的替代解决方案:bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
评论
好主意,我们在RegexOptions中也有很多按位组合,例如RegexOptions.IgnoreCase和RegexOptions.IgnorePatternWhitespace&RegexOptions.CultureInvariant;如果有帮助的话。
–萨拉瓦南
11年8月24日在4:36
必须说我更喜欢这种方法,尽管使用IsMatch保持整洁。
– wonea
2011年9月7日于17:40
更糟糕的是,由于搜索字符串被解释为正则表达式,因此许多标点符号会导致错误的结果(或由于表达式无效而触发异常)。尝试搜索“。” “这是不包含搜索字符串的示例字符串”中的内容。或者尝试搜索“(无效)”。
– cHao
2011年9月9日在13:28
@cHao:在这种情况下,Regex.Escape可以提供帮助。当IndexOf / extension Contains很简单(并且可以说更清晰)时,正则表达式似乎仍然不必要。
– Dan Mangiarelli
2011年9月9日在16:44
请注意,我并不是在暗示这种Regex解决方案是最好的方法。我只是将其添加到原始发布的问题的答案列表中,“是否有办法使以下返回为真?”。
–杰德
2011-09-13 15:43
#5 楼
您总是可以先将字符串大写或小写。string title = "string":
title.ToUpper().Contains("STRING") // returns true
糟糕,刚刚看到了最后一点。不区分大小写的比较无论如何都可能会执行相同的操作,并且如果性能不是问题,则在创建大写副本并进行比较时不会出现问题。我本该发誓说我曾经看到过不区分大小写的比较...
评论
搜索“土耳其测试” :)
–乔恩·斯基特(Jon Skeet)
09年1月14日在21:48
在某些法语语言环境中,大写字母没有变音符号,因此ToUpper()可能不会比ToLower()好。我会说,如果可用,请使用适当的工具-不区分大小写的比较。
–布莱尔·康拉德(Blair Conrad)
09年1月14日在22:03
不要使用ToUpper或ToLower,而是按照乔恩·斯凯特所说的做
– Peter Gfader
09年8月21日在2:49
两年后又重新投票,再次看到了这一点……无论如何,我同意有比较字符串的更好方法。但是,并非所有程序都将本地化(大多数不会),并且许多程序是内部或一次性应用程序。由于我几乎不能指望为可抛弃式应用程序留下最好建议的信誉...我在继续:D
– Ed S.
2011-1-25在7:28
搜索“土耳其测试”是否与搜索“土耳其测试”相同?
– JackAce
18年6月1日在16:24
#6 楼
仅.NET Core 2.0+(到目前为止).NET Core从2.0版开始就有一对方法来处理此问题:
String。 Contains(Char,StringComparison)
String.Contains(String,StringComparison)
示例:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
及时,他们会可能会进入.NET标准,并从那里进入基类库的所有其他实现。
评论
现在也可以在.NET Standard 2.1中使用
–PawełBulwan
4月5日上午11:32
在.NET 5.0中也可用。
– DariuszWoźniak
11月17日12:20
#7 楼
答案的一个问题是,如果字符串为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;
}
评论
如果toCheck是空字符串,则需要根据Contains文档返回true:“如果value参数出现在该字符串中,或者value是空字符串(“”),则返回true;否则,返回false。
– Amurra
2011-2-16在16:13
基于上面的amurra评论,是否需要更正建议的代码?难道这不应该添加到已接受的答案中,以便最佳响应是第一位的吗?
–大卫·怀特
2011年8月30日,下午3:43
现在,如果source是一个空字符串或null(无论toCheck是什么),它将返回true。那是不正确的。如果toCheck为空字符串且source不为null,则IndexOf也已返回true。这里需要检查是否为空。我建议如果(source == null || value == null)返回false;
–科林
13年7月1日在12:21
来源不能为空
–卢卡斯
16 Dec 14'在16:55
如果(string.IsNullOrEmpty(source))返回string.IsNullOrEmpty(toCheck);
–凯尔·德莱尼(Kyle Delaney)
18-4-4在13:39
#8 楼
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;
}
}
评论
为什么在StringComparison上允许另一个抽象层?
– Alex Gordon
19年6月20日在18:37
#9 楼
这很干净简单。Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
评论
不过,这将与模式匹配。在您的示例中,如果fileNamestr具有任何特殊的正则表达式字符(例如*,+ 、.等),那么您将大吃一惊。使此解决方案像适当的Contains函数一样工作的唯一方法是通过执行Regex.Escape(fileNamestr)来转义fileNamestr。
–XåpplI'-I0llwlg'I-
13年2月3日在15:18
此外,与简单的不区分大小写的比较相比,解析和匹配正则表达式要占用更多资源
–phuclv
19年11月30日在5:51
#10 楼
OrdinalIgnoreCase,CurrentCultureIgnoreCase或InvariantCultureIgnoreCase?由于缺少此功能,因此以下是一些有关何时使用哪个建议:
Dos
将
StringComparison.OrdinalIgnoreCase
进行比较作为与文化无关的字符串匹配的安全默认值。
使用
StringComparison.OrdinalIgnoreCase
进行比较以提高速度。
显示
StringComparison.CurrentCulture-based
字符串操作时输出给用户。
在比较
在语言上不相关(例如符号)时,根据不变的文化来切换当前对字符串操作的使用,以使用非语言的
StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
。 对字符串进行标准化以进行比较时,请使用
ToUpperInvariant
而不是ToLowerInvariant
。不要
对不进行字符串操作的字符串操作使用重载t显式
或隐式指定字符串比较机制。
在大多数情况下,请使用基于
StringComparison.InvariantCulture
的字符串操作;少数例外之一是
保留语言上有意义但与文化无关的数据。
基于这些规则,您应该使用:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
// The string exists in the original
}
[YourDecision]取决于上面的建议。
源链接:http://msdn.microsoft.com/zh-cn/library/ms973919.aspx
评论
如果您知道您总是会得到一个英语字符串怎么办。使用哪一个?
– BKSpurgeon
17 Mar 23 '17 at 23:43
@BKSpurgeon我会使用OrdinalIgnoreCase,如果大小写无关紧要
–法比安·比格勒(Fabian Bigler)
17年3月24日在8:09
#11 楼
这些是最简单的解决方案。通过索引
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// contains
}
通过更改大小写
string title = "STRING";
bool contains = title.ToLower().Contains("string")
通过Regex
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
#12 楼
就像这样:string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
Console.WriteLine("yes");
}
评论
这不是特定于文化的,在某些情况下可能会失败。 culture.CompareInfo.IndexOf(段落,单词,CompareOptions.IgnoreCase)应使用。
–hikalkan
14年7月22日在7:50
为什么在进行不区分大小写的字符串比较时避免使用string.ToLower()? Tl; Dr这是昂贵的,因为要“制造”新的字符串。
–利亚姆
16-10-10在10:00
#13 楼
我知道这不是C#,但是在框架(VB.NET)中已经有这样的功能了。Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")
C#变体:
string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");
#14 楼
如果您担心国际化(或者可以重新实现),则VisualBasic程序集中的InStr
方法是最好的。查看其中的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);
}
#15 楼
简单易用title.ToLower().Contains("String".ToLower())
#16 楼
使用此:string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
评论
发问者正在寻找“包含不比较”。
– DuckMaestro
2011年7月11日在8:05
@DuckMaestro,可接受的答案是使用IndexOf实现Contains。因此,这种方法同样有用!本页上的C#代码示例使用string.Compare()。是SharePoint团队的选择!
–火神乌鸦
2013年1月5日10:07
为什么有这个ans。赞:(
– X-Coder
12月8日15:01
#17 楼
这与这里的其他示例非常相似,但是我决定将枚举简化为bool,因为主要不需要其他替代方法。这是我的示例: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;
}
}
用法类似于:
if( "main String substring".Contains("SUBSTRING", true) )
....
#18 楼
使用RegEx是执行此操作的直接方法:Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
评论
您的答案与guptat59的答案完全相同,但是正如他在答案中所指出的那样,它将匹配一个正则表达式,因此,如果您测试的字符串包含任何特殊的正则表达式字符,则不会产生预期的结果。
–卡西
2013年12月9日在22:55
这是该答案的直接副本,并且存在与该答案中所述相同的问题
–利亚姆
16-10-10在10:04
同意研究正则表达式
–讨厌
17/12/26在5:14
#19 楼
只是基于此处的答案,您可以创建一个字符串扩展方法以使其更加人性化: public static bool ContainsIgnoreCase(this string paragraph, string word)
{
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
}
评论
假设您的段落和单词将始终在美国
–鲍里斯·卡伦斯(Boris Callens)
19-2-15在13:42
为了避免强制文化进入美国的问题,请使用return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph,word,CompareOptions.IgnoreCase)> = 0;。代替。
–安德鲁·沃兰(AndrewWhalan)
19年6月13日在21:42
#20 楼
如果要检查传递的字符串是否在字符串中,则有一个简单的方法。string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";
bool isContained = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;
如果包含或不包含字符串,则返回此布尔值
#21 楼
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}
#22 楼
您可以使用string.indexof ()
功能。这将不区分大小写#23 楼
这里的技巧是查找字符串,忽略大小写,但要使其完全相同(大小写相同)。 var s="Factory Reset";
var txt="reset";
int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
var subString = s.Substring(first - txt.Length, txt.Length);
输出为“重置”
#24 楼
与先前的答案类似(使用扩展方法),但具有两个简单的null检查(C#6.0及更高版本):public static bool ContainsIgnoreCase(this string source, string substring)
{
return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}
如果source为null,则返回false(通过null传播运算符?。)
如果子字符串为null,则将其视为空字符串并返回true(通过null运算符??)。
当然,如果需要,可以将StringComparison作为参数发送。
#25 楼
public static class StringExtension
{
#region Public Methods
public static bool ExContains(this string fullText, string value)
{
return ExIndexOf(fullText, value) > -1;
}
public static bool ExEquals(this string text, string textToCompare)
{
return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
}
public static bool ExHasAllEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index]) == false) return false;
return true;
}
public static bool ExHasEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index])) return true;
return false;
}
public static bool ExHasNoEquals(this string text, params string[] textArgs)
{
return ExHasEquals(text, textArgs) == false;
}
public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
{
for (int index = 0; index < textArgs.Length; index++)
if (ExEquals(text, textArgs[index])) return false;
return true;
}
/// <summary>
/// Reports the zero-based index of the first occurrence of the specified string
/// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
/// A parameter specifies the type of search to use for the specified string.
/// </summary>
/// <param name="fullText">
/// The string to search inside.
/// </param>
/// <param name="value">
/// The string to seek.
/// </param>
/// <returns>
/// The index position of the value parameter if that string is found, or -1 if it
/// is not. If value is System.String.Empty, the return value is 0.
/// </returns>
/// <exception cref="ArgumentNullException">
/// fullText or value is null.
/// </exception>
public static int ExIndexOf(this string fullText, string value)
{
return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
}
public static bool ExNotEquals(this string text, string textToCompare)
{
return ExEquals(text, textToCompare) == false;
}
#endregion Public Methods
}
#26 楼
根据现有的答案和Contains方法的文档,我建议创建以下扩展名,该扩展名还应注意一些特殊情况:public static class VStringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (toCheck == null)
{
throw new ArgumentNullException(nameof(toCheck));
}
if (source.Equals(string.Empty))
{
return false;
}
if (toCheck.Equals(string.Empty))
{
return true;
}
return source.IndexOf(toCheck, comp) >= 0;
}
}
#27 楼
新手的简单方法:title.ToLower().Contains("string");//of course "string" is lowercase.
评论
因不正确而投降。如果标题= StRiNg怎么办? StRiNg!=字符串和StRiNg!= STRING
–bernies学习
17-10-21在4:30
我错了。如下编辑答案,太简单了:
title.ToLower()。Contains(“ string”)//当然“ string”是小写的
– OThạnhLdt
18-3-23在3:28
评论
为什么不Culture.CompareInfo.IndexOf(paragraph,word,CompareOptions.IgnoreCase)> = 0?它使用正确的区域性并且不区分大小写,不分配临时的小写字符串,并且避免了是否转换为小写并进行比较始终与不区分大小写的比较相同的问题。
–Quartermeister
13年3月18日在15:32
该解决方案还通过为应为搜索功能分配内存来不必要地污染堆
– JaredPar
13年3月18日在16:09
当两个不同的字母具有相同的小写字母时,与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
13年3月18日在17:47
@Quartermeister-和BTW,我相信.NET 2和.NET4在此方面的行为有所不同,因为.NET 4始终使用NORM_LINGUISTIC_CASING,而.NET 2则没有(此标志在Windows Vista中已经出现)。
–西蒙·穆里尔(Simon Mourier)
13年3月23日在8:13
为什么不写“ ddddfg” .IndexOf(“ Df”,StringComparison.OrdinalIgnoreCase)?
–陈
2015年8月23日在13:41