C#でいくつかの文字列を検索するにはどうすればよいですか? 文字列「James Bond」があり、「James」または「james」を検索すると true が返されますが、「jame」を検索すると false が返されます。どうすればそれができますか?多分私はほとんど特定する必要はありません。「 」で区切られた単語に基づいて検索する必要があります 上記を参照してください。jam を検索すると、false が返されます。jam を検索するときに contains を使用すると、true も返されますか?
7 に答える
これに使用する必要がありますRegex
。Contains
大文字と小文字を区別せず、単語パターン全体と一致しないため、を使用することはできません。代わりにこれを使用してください:
string text = "James bond";
// this will return true
bool result = Regex.IsMatch(text, "\\bjames\\b", RegexOptions.IgnoreCase);
// this will return false
bool result = Regex.IsMatch(text, "\\bjame\\b", RegexOptions.IgnoreCase);
Regex
フォーマットでは、上記の\b
sは英数字と非英数字の境界に一致します(またはその逆)。この場合、これにより、単語の一部ではなく、単語全体が一致james
するようになります。jame
あなたの質問によると、これはあなたが使うものです。
var ex = "James Bond".ToLower(); //normalize case
bool contains = ex.Split(' ').Any( x => x == "jame");
//FALSE because the *word* "jame" is not found in "james bond"
この質問は多くの混乱を引き起こしているため、関連するすべての大文字と小文字を覚えておく必要があります。
var ex = "James Bond";
bool contains = ex.Contains("jame");
// FALSE because "jame" is not found in "James Bond" due to case-sensitivity
var ex = "James Bond".ToLower(); //normalize case
bool contains = ex.Contains("jame");
// TRUE because "jame" is FOUND in "james bond" due to normalized case
を使用Split
して、文字列を分割された部分に分けることができます。元:
string[] items = "James Bond".Split(' ');
// items == { "James", "Bond" }
ToLower
大文字と小文字の区別を防ぐために使用できます。元:
string lower = "James Bond".ToLower();
// lower == "james bond"
StartsWith
文字列が部分文字列で始まるかどうかを判断するために使用できます。元:
bool startsWithJame = "James Bond".StartsWith("Jame");
// startsWithJame == true
それらをすべて一緒に使用する:
bool anyWordStartsWith_jame_NoCaseSensitivity =
"James Bond"
.ToLower()
.Split(' ')
.Any(str => str.StartsWith("jame"));
// anyWordStartsWith_jame_NoCaseSensitivity == true
単語の境界を使用した正規表現でそれを行うことができます。次のコードは、大文字と小文字を区別しない検索を使用して照合し、「jame」などの誤検知を起こさないようにする方法を示しています。特定の文字列のどこでも機能します。
static void Main(string[] args)
{
string name_to_match = "James Bond";
string word_to_find = "james";
string word_to_not_find = "jame";
string patternToFind = string.Format(@"\b{0}\b", word_to_find);
string patternToNotFind = string.Format(@"\b{0}\b", word_to_not_find);
Regex regexToFind = new Regex(patternToFind, RegexOptions.IgnoreCase);
Regex regexToNotFind = new Regex(patternToNotFind, RegexOptions.IgnoreCase);
bool foundNameExpected = regexToFind.IsMatch(name_to_match);
bool foundNameNotExpected = regexToNotFind.IsMatch(name_to_match);
}
この場合、ブール値のfoundNameExpectedはtrueになりますが(「james」は「JamesBond」の「James」と一致すると予想されるため)、foundNameNotExpectedはfalseになります(「jame」を「James」と一致させたくないため)。
正規表現を使用します。例については、次を参照してください。
http://msdn.microsoft.com/en-us/library/ms228595%28v=vs.80%29.aspx
これは、文字列内のどこかに "cow" が見つかった場合に一致します。あなたの場合、それは「ジャム」になります。
メソッドを使用Contains
して検索できます。
string[] names = new string[] { "joe", "bob", "chris" };
if(names.Contains("james")){
//code
}
これを試してみてください。
方法:1
string s1 = "The quick brown fox jumps over the lazy dog";
string s2 = "fox";
bool b;
bool c;
b = s1.Contains(s2);
c = s1.Contains("test")
bool b は true を返します。
bool c は false を返します。
方法:2
string str = "My Name is james";
int result = str.IndexOf("james");
文中に特定の単語が見つからない場合、result は -1 になります。