2013-02-14 4 views
2

По этой ссылке Search for “whole word match” with SQL Server LIKE patternПоиск «точное совпадение слова» в Datatable с использованием регулярных выражений

Я хочу следовать той же строки запроса, но в DataTable я написал следующее заявление

Предположим, 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(); 

, но результат был р = 4, а это слово «окна» существует только в 3 раза

И случай использования «где» вместо «выберите» следующим

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

р всегда 0

Что плохого в моем заявлении ..Any советы ?!

+1

Я не понимаю, что вы подразумеваете под * ", результат был равен p = datatable rows count, в то время как это слово« окна »не существует во всех строках» * Вы говорите, что он возвращает количество строк и а не счет только строк, содержащих слово «окна»? –

+0

этот оператор возвращает все число строк в datatable, в то время как ключевое слово «окна» существует в некоторых из этих строк не все из них – user690069

+0

Извините, но я до сих пор не понимаю, что вы имеете в виду. Скажите нам, что вы ожидаете от p, и что он на самом деле содержит. –

ответ

2

Ваш первый пример (Select) запускает операцию во всех строках таблицы данных. Результатом будет список булевых значений, указывающих, соответствует ли значение строки выражению.

В обоих случаях ваш шаблон , требующий не-альфа перед и после слова "окна", что приводит к тому, что оно не соответствует. В первом случае вы получите список, содержащий 4 «ложных» значения, а во втором ничего не получите.

Я считаю, что самое простое регулярное выражение, чтобы получить то, что вы хотите, вероятно, что-то вроде:

"\bwindows\b" 

(используя предложенный регулярное выражение Роберта Харви Эта модель утверждает, что существует «слово перерыв» - не включая ничего - до и. . после слова)

+0

@RobertHarvey Я пойду с этим, хотя совпадение LIKE не будет утверждать ни слова полного слова. – GalacticCowboy

+1

Это то, что происходит, когда люди поднимают код, не понимая, как он работает. –

0

Select и Where не являются взаимозаменяемыми. - ваш выбор будет возвращать значение в true или false для каждой записи, поэтому ваш отсчет 4 (потому что у вас есть 4 записи и, таким образом 4 возвращаемые значения

Ваше предложение where, возвращающее 0, сообщает мне, что ваш RegEx не соответствует значениям 0-2. Я бы удостоверился, что RegEx работает так, как ожидалось.

+0

Ваше регулярное выражение также соответствует 'xwindows'. –

+0

Учитывая, что было очень мало деталей относительно ТОЧНО, что ОП ожидал сопоставить, я сделал предположение ... –

+0

да как @RobertHarvey сказал, что ваше регулярное выражение, т.е. xwindows, я хочу совпадение с одним и тем же ключевым словом только в дополнение к тому, чтобы принимать во внимание знаки препинания как точка с запятой, запятая, .. и т. д.like (windows;) – user690069

Смежные вопросы