2013-09-03 14 views
5

Próbuję wyodrębnić cały tekst (pokazane jako xxxx) we wzorcu obserwacji:Regex wzorzec dla tekstu między 2 ciągi

Session["xxxx"] 

użyciu C#

To może być Request.Querystring["xxxx"] więc staram dynamicznie budować wyrażenie. Kiedy to zrobić, mam wszelkiego rodzaju problemów dotyczących Niecytowany charecters lub Nie znaleziono :(

przykładem może być:

string patternstart = "Session["; 
string patternend = "]"; 
string regexexpr = @"\\" + patternstart + @"(.*?)\\" + patternend ; 
string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; 

MatchCollection matches = Regex.Matches(sText, @regexexpr); 

Czy ktoś może pomóc z tym jak ja zakłopotany (jak zawsze wydaje się być z RegEx :))

+0

staram się zrobić to samo dla sesji projektu VB ("xxxx") – Arjang

Odpowiedz

7

Kilka drobnych modyfikacji kodu.

string patternstart = Regex.Escape("Session["); 
string patternend = Regex.Escape("]"); 
string regexexpr = patternstart + @"(.*?)" + patternend; 
+0

Zapominasz ' "". Twój wzór będzie pasował do 'Session []' też –

+0

@SriramSakthivel Czy przetestowałeś go przed komentowaniem? Zobacz użycie: 'var matches = Regex.Matches (sText, regexexpr) .Cast (). Wybierz (m => m.Groups [1] .Value) .ToList();' – I4V

+0

Awsome ... thanks – spanout

1

Znaki [ i ] mają specjalne znaczenie dla wyrażeń regularnych - definiują grupę, w której jeden z zawartych znaków musi być zgodny. Aby obejść ten problem, po prostu „uciec” nich z wiodących \ Charakter:

string patternstart = "Session\["; 
string patternend = "\]"; 

Przykładem „ostateczne string” może następnie być:

Session\["(.*)"\] 

Jednakże, można łatwo napisać regex do obsługi sesja, kwerendy, etc automatycznie, jeśli wymagają (bez dopasowania również każdą inną tablicę rzucisz na niego), i uniknąć konieczności budowania ciąg w pierwszej kolejności:

(Querystring|Session|Form)\["(.*)"\] 

a następnie tAK e drugi mecz.

1

Wzór skonstruować w swoim przykładzie wygląda mniej więcej tak:

\\Session[(.*?)\\] 

Istnieje kilka problemów z tym. Najpierw zakłada, że ​​ciąg zaczyna się od dosłownego ukośnika odwrotnego, po drugie, opakowuje cały kod (.*?) w klasę znaków, co oznacza, że ​​będzie pasował do każdego otwartego nawiasu, kropki, gwiazdki, znaku zapytania, zamkniętego nawiasu lub ukośnika odwrotnego. Jeśli chcesz dopasować literał [, musisz uciec od nawiasów w swoim wzorze.

Można użyć wzoru takiego:

Session\[(.*?)] 

na przykład:

string regexexpr = @"Session\[(.*?)]"; 
string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; 

MatchCollection matches = Regex.Matches(sText, @regexexpr); 
Console.WriteLine(matches[0].Groups[1].Value); // "xxxx"