2017-12-22 9 views
-1

私が作成した文字列の配列内に文字列で始まる文字列かどうかを調べようとしています。ここに私のコードです:指定された文字列で始まる文字列の配列をチェックする(大文字と小文字を区別しない)

string x = "Table a"; 
string y = "a table"; 
string[] arr = new string["table", "chair", "plate"] 
if (arr.Contains(x.ToLower())){ 
    // this should be true 
} 
if (arr.Contains(y.ToLower())){ 
    // this should be false 
} 

私のif文が真実になるようにするにはどうすればいいですか? Idは大文字と小文字を無視して、文字列xの先頭を配列の内容にマッチさせるだけです。私はこれを行うにはI needed regexだと思ったが、間違いかもしれない。私は正規表現を持つ初心者のビットです。

+1

あなたが尋ねていることは不明です...言い換えればさらに... 'if(...)'はここで何をしなければならないのですか? arrとは何ですか? xは文字列ですか?正規表現?何 ? –

+3

正規表現がこの質問と何をしているのかわかりません。 – Amy

+1

正規表現がどこに来るのかはまだ分かりませんが、 'StartsWith'(' Any'と組み合わせて)のように聞こえます。 –

答えて

2

は、あなたの文字列があなたのリストから要素を含んでいるかどうかを確認したいと思われるので、これはあなたが探しているものでなければなりません:またはに基づい

if (arr.Any(x.ToLower().Contains)) 

if (arr.Any(c => x.ToLower().Contains(c))) 

それとも単純あなたのコメントはあなたがこれを使用するかもしれません:

if (arr.Any(x.ToLower().Split(' ')[0].Contains)) 
+0

これは先行する文字を無視しないため動作しません。 "a table"は "table"と一致しないはずですが、 "table a"は一致するはずです。 –

+0

@BrianUpwardこの場合、 'Split'を使用してください。 –

+0

これはあなたの場合ではありません(例えば、 (Contains) - https://stackoverflow.com/questions/444798/case-insensitive-containsstring –

-1

私はあなたがここで言うことをしようとしていると思う、althouまだあいまいさがあります。あなたの文字列中の1つの単語(文章)があなたの配列に存在するかどうか確認しようとしていますか?

@Amyは正しいですが、これはRegexではまったく関係ありません。

私は、コードのこのセグメントは、あなたが(簡単にC#2に変換することができます)Javaでやりたいだろうと思う:

のJava:

x = x.ToLower(); 
string[] words = x.Split("\\s+"); 
foreach(string word in words){ 
    foreach(string element in arr){ 
     if(element.Equals(word)){ 
      return true; 
     } 
    } 
} 
return false; 

あなたはまた、要素を格納するための設定を使用することができますあなたのアレイでは、より効率的なルックアップを行うことができます。

のJava:

x = x.ToLower(); 
string[] words = x.Split("\\s+"); 
HashSet<string> set = new HashSet<string>(arr); 
for(string word : words){ 
    if(set.contains(word)){ 
     return true; 
    } 
} 
return false; 

編集:私はC#で私の解決策を書き直し

(12/22、11:05)、@Amyと@JohnyLによってリマインダのおかげ。著者は専用の文字列の最初の単語に一致するように望んでいるので、この編集されたコードは動作するはずです:)

C#の:あなたは正規表現を設定することができます

static bool contains(){ 
     x = x.ToLower(); 
     string[] words = x.Split(" "); 
     var set = new HashSet<string>(arr); 
     if(set.Contains(words[0])){ 
      return true; 
     } 
     return false; 
    } 
+0

私は自分の質問を編集しました。私は基本的にxの終わりを無視して、配列内の任意の文字列の先頭に一致させたい。 –

+0

'String word:words'とは何ですか?それはC#ですか? – JohnyL

+1

@BrianUpwardこのソリューションは、xの任意の単語と配列の要素をマッチさせます。あなたのユースケースでうまくいくでしょう。 – Ninja

0

あなたが正規表現をしたいと言ったので... var regex = new Regex("(table|plate|fork)");
とに手で問題のためにそれをif(regex.IsMatch(myString)) { ... }

をチェックしますが、あなたは正確なストリングを探しているよう...あなたは@ S.Akbとして
を(使用することができ、正規表現を使用する必要がいけませんif (arr.Any(c => x.ToLower().Contains(c))) { ... }

+0

'var regex = new Regex("(?i)(table | plate | fork) ")' :) – JohnyL

0

Enumerable.Containsが正確な値と一致する場合は、各配列要素をパラメータとしてチェックを実行する述語を取るAnyが必要です。

var myString = "some string" 
    if (arr.Any(arrayItem => myString.Contains(arrayItem)))... 

今、あなたが実際にを求めて「という文字列与えられた単語で始まる」とだけ含まれていない - だから:のような配列から要素を含むように指定した文字列が - だから、最初のステップは、あなたが他の方法で回避すること「が含まれて」したいです明らかにStartsWith必要があります(便利な大文字と小文字の区別を指定することができますContainsとは異なり - Case insensitive 'Contains(string)'):このコードは、「tableAAAボブ」を受け入れます

 if (arr.Any(arrayItem => myString.StartsWith(
       arrayItem, StringComparison.CurrentCultureIgnoreCase))) ... 

注こと - あなたは本当に良い選択かもしれ単語境界正規表現に分割する必要がある場合。あなたがすべての値を適切にエスケープする限り、正規表現を動的に構築するのは簡単です。

正規表現は、文字列の

  • 始めなければなりません - ^
  • が正しく、あなたが探している単語をエスケープ - ブレークEscape Special Character in Regex
  • 語 - \ B

    if (arr.Any(arrayItem => Regex.Match(myString, 
         String.Format(@"^{0}\b", Regex.Escape(arrayItem)), 
         RegexOptions.IgnoreCase)) ... 
    
+0

これは間違いなく簡単です。答えをありがとう!次回はそれを念頭に置いておきます。 –

+0

@BrianUpward 'StartsWith'は単語の境界をチェックしないことに注意してください。私は正規表現のバージョンも追加しました。 –

-1

申し訳ありません私の質問はあまりにも曖昧でしたが、彼はそれは答えた少数の人の助けを借りてありがとうございます。

var regex = new Regex("^(table|chair|plate) *.*"); 
if (regex.IsMatch(x.ToLower())){} 
+1

このソリューションでは、検索した値をハードコードし、arrの内容は使用しません。あなたが尋ねた質問は、あなたのソリューションに全く無関係で、誤解を招くほどのものでした。 – simonzhu

+0

この回答では、 'table a'と' tablet'( 'tablet'が一致してはならないという質問に基づいて)を正しく区別していません。 –

+0

ちょうど私が間違っていると言っているのではなく、答えで私を助けてうれしいです。 –

関連する問題