2014-06-26 23 views
5

Poszukuję sposobu na wyszukanie ciągu znaków dla dopasowania dokładnego lub dopasowania całego słowa. RegEx.Match i RegEx.IsMatch wydaje mi się, że nie dostaję mnie tam, gdzie chcę być.
Rozważmy następujący scenariusz:string.IndexOf wyszukiwanie całego słowa meczu

namespace test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string str = "SUBTOTAL 34.37 TAX TOTAL 37.43"; 
      int indx = str.IndexOf("TOTAL"); 
      string amount = str.Substring(indx + "TOTAL".Length, 10); 
      string strAmount = Regex.Replace(amount, "[^.0-9]", ""); 

      Console.WriteLine(strAmount); 
      Console.WriteLine("Press any key to continue..."); 
      Console.ReadKey(); 
     } 
    } 
} 

Wyjście powyższego kodu jest:

// 34.37 
// Press any key to continue... 

Problemem jest to, nie chcę SUBTOTAL, ale IndexOf znajduje pierwsze wystąpienie słowa TOTAL który jest w SUBTOTAL, który następnie daje niepoprawną wartość 34,37.

Pytanie brzmi, czy istnieje sposób na wymuszenie IndexOf znalezienia tylko dokładnego dopasowania lub czy istnieje inny sposób wymuszenia tego dokładnego dopasowania całego słowa, aby można było znaleźć indeks tego dokładnego dopasowania, a następnie wykonać kilka użytecznych z nim funkcjonować. RegEx.IsMatch i RegEx.Match są, o ile mogę powiedzieć, po prostu boolean wyszukiwania. W tym przypadku nie wystarczy znać dokładnego dopasowania. Muszę wiedzieć, gdzie istnieje w ciągu znaków.

Każda rada byłaby doceniona.

+0

'str.IndexOf (" TOTAL ");' Ale jest brzydka. – Bun

Odpowiedz

9

Można użyć wyrażenia regularnego

string str = "SUBTOTAL 34.37 TAX TOTAL 37.43"; 
var indx = Regex.Match(str, @"\WTOTAL\W").Index; // will be 18 
+0

Dzięki! To znacznie czystsze! Kto wiedział, że istnieje ".Index" zwisający z RegEx.Match? :) :) :) –

+0

Jakiś czas temu pojawił się wpis dotyczący tej odpowiedzi, używając wzorca RegEx, który zwrócił liczbę po dokładnym dopasowaniu do "TOTAL". Czy ktoś jeszcze to widział? Czy ktoś ma ochotę rozważyć taki schemat? –

+0

@DJ Szukasz czegoś podobnego do 'var val = Regex.Match (str, @" \ WTOTAL \ W \ s * ([0-9 \.] +) "). Groups [1] .Value;' –

0

Choć może to być hack, które po prostu działa tylko na swoim przykładzie, spróbuj

string amount = str.Substring(indx + " TOTAL".Length, 10); 

dając dodatkową przestrzeń przed ogółem. Ponieważ nie będzie to miało miejsca w przypadku SUBTOTAL, należy pominąć słowo, którego nie chcesz i po prostu odszukać izolowane TOTAL.

+0

LOL !!! Dlaczego tego nie widziałem! Jest trochę "hacky", ale na mój przykład powinien działać. Naprawdę chciałbym zobaczyć, czy istnieje sposób, aby wymusić dopasowanie całego słowa w bardziej czystym podejściu, ale oznaczy to jako odpowiedź, jeśli nie zobaczę bardziej wyrafinowanej odpowiedzi w ciągu dnia. DZIĘKI WIELKIE!!! :) –

0

Moja metoda jest szybsza niż zaakceptowanej odpowiedzi, ponieważ nie użyć wyrażenia regularnego.

string str = "SUBTOTAL 34.37 TAX TOTAL 37.43"; 
var indx = str.IndexOfWholeWord("TOTAL"); 

public static int IndexOfWholeWord(this string str, string word) 
{ 
    for (int j = 0; j < str.Length && 
     (j = str.IndexOf(word, j, StringComparison.Ordinal)) >= 0; j++) 
     if ((j == 0 || !char.IsLetterOrDigit(str, j - 1)) && 
      (j + word.Length == str.Length || !char.IsLetterOrDigit(str, j + word.Length))) 
      return j; 
    return -1; 
}