2

このリンクによると、SQLServerのLIKEパターンで「単語全体の一致」を検索します

同じクエリ文字列をたどりたいのですが、データテーブルに次のステートメントを記述しました

datatableに次のレコードが含まれていると仮定します

datatable[0]["src"]="tst";
datatable[1]["src"]="tst,";
datatable[2]["src"]="tst:";
datatable[3]["src"]="disney";

int p=datatable.AsEnumerable().Select(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count();

しかし、結果はp = 4でしたが、この単語「windows」は3回しか存在しません

そして、次のように「select」の代わりに「where」を使用する場合

int p=datatable.AsEnumerable().Where(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count();

pは常に0です

私の声明の何が問題になっていますか..何かアドバイスはありますか?!

4

2 に答える 2

2

最初の例 ( Select) は、データ テーブル内のすべての行に対して操作を実行します。結果は、行の値が式と一致したかどうかを示すブール値のリストになります。

どちらの場合も、パターンは「windows」という単語の前後に非アルファを必要とするため、一致しません。最初のケースでは、4 つの「偽」の値を含むリストを取得し、2 番目のケースでは何も取得しません。

必要なものを取得するための最も簡単な正規表現は、おそらく次のようなものだと思います。

"\bwindows\b"

(Robert Harvey が提案した正規表現を使用します。このパターンは、単語の前後に「単語の区切り」が存在することを表明します。このパターンには何も含まれていません。)

于 2013-02-14T19:39:35.973 に答える
0

Select交換可能ではありWhereません-selectは各レコードに対してtrueまたはfalse値を返します。これが、カウントが4である理由です(4つのレコードがあるため、4つの戻り値があるためです.

0 を返す where 句は、正規表現が値 0 ~ 2 と一致していないことを示しています。正規表現が期待どおりに機能することを確認します。

于 2013-02-14T19:40:11.943 に答える