2013-10-07 2 views
0

Я создал небольшую консольную программу, которая будет искать текстовые файлы и возвращать все строковые строки, соответствующие переменной, введенной пользователем. Одна из проблем, с которыми я столкнулась, - это сказать, что я хочу найти «1234», который представляет собой код местоположения, но есть также номер телефона, который имеет «555-1234» в строковой строке, и я получаю эту обратно. Я думаю, если я введу разделитель (ex: «,») с переменной («, 1234»), то, возможно, я могу обеспечить точность поиска. Я на правильном пути, или есть лучший способ? Здесь я до сих пор:Поиск символа строки с разделителем

string[] file = File.ReadAllLines(sPath); 
    foreach (string s in file) 
    { 
     using (StreamWriter sw = File.AppendText(rPath)) 
     { 
      if (sFound = Regex.IsMatch(s, string.Format(@"\b{0}\b", 
       Regex.Escape(searchVariable)))) 
      { 
       sw.WriteLine(s); 
      } 
     } 
    } 
+0

У вас есть файл CSV? – Ryan

+0

По большей части они будут csv-файлами, но иногда я сталкиваюсь с файлами, связанными с pipe или ^, поэтому, возможно, я бы ввел пользовательский разделитель в начале. – Mikem

+2

Используйте Linq для CSV и сделайте вашу жизнь проще. Просто зайдите в Nuget и найдите Linq в CSV. – jcwrequests

ответ

0

Я бы сказал, что вы на правильном пути.

Я бы предложил изменить регулярные выражения так, чтобы он использовал negative lookbehind, чтобы соответствовать «searchVariable», который не превзошел «-», поэтому «1234» в «555-1234» не будет соответствовать, , 1234 "(например).

Вам нужно будет использовать только "Regex.Escape()", если вы хотите включить в свой поиск специальные символы регулярного выражения, которые из вашего вопроса вы не хотите делать.

Вы можете изменить код, чтобы что-то вроде этого (уже поздно, так что я не проверял это!): (!) Часто сложно

var lines= File.ReadAllLines(sPath); 
var regex = new Regex(String.Format("(?<!-){0}\b", searchVariable)); 

if (lines.Any()) 
{ 
using (var streamWriter = File.AppendText(rPath)) 
{  
    foreach (var line in lines) 
    { 
    if (regex.IsMatch(line)) 
    { 
    streamWriter.WriteLine(line); 
    } 
    } 
} 
} 

Отличный сайт для тестирования этих регулярных выражений Regex Hero.

+0

Как включить введенную пользователем переменную с переменной regex? – Mikem

+0

@ user2836200 Я обновил регулярное выражение, так что теперь введенная пользователем переменная включена. Я также изменил регулярное выражение так, чтобы «-» в «555-1234» не совпало, но «, 1234» (например). –

+0

EEK! Я забыл добавить String.Format, поэтому добавление переменной не сработало бы для меня. Я ценю обратную связь, но даже обновленное Regex импортирует дополнительные строки, если в строке строки указано «32541234». Я думаю, что если я смогу сопоставить только то, что находится между разделителем, он будет точным каждый раз. – Mikem

0

Используйте Linq для CSV и сделайте вашу жизнь проще. Просто зайдите в Nuget и найдите Linq в CSV.

+0

Я новичок в написании кода, поэтому я искал linq для CSV, но не знаю, что с этим делать. – Mikem

+0

Проверьте эту ссылку. http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library – jcwrequests

+0

Будет, спасибо! – Mikem

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