2012-09-22 9 views
6

Używając wyrażeń regularnych, jak można wyodrębnić cały tekst w cudzysłowach, a wszystkie słowa z cytatami w taki ciąg:wyrażeń regularnych: wyodrębnić wszystkie słowa z cytatami

01AB "SET 001" IN SET "BACK" 09SS 76 "01 IN" SET 

pierwsze wyrażenie regularne powinno wyodrębnić cały tekst wewnątrz podwójnych cudzysłowów jak

SET 001 
BACK 
01 IN 

drugie wyrażenie shoud wyodrębnić wszystkie inne słowa w ciąg

01AB 
IN 
SET 
09SS 
76 
SET 

Dla pierwszego przypadku działa dobrze ("(.*?)"). Jak wyodrębnić wszystkie wyrazy z cudzysłowu?

+0

Sprawdź to [link] (http://stackoverflow.com/questions/9133220/regex-matches-c-sharp-double-quotes) jego prawie takie same – andy

Odpowiedz

5

Spróbuj wyrażenie:

(?:^|")([^"]*)(?:$|") 

grupach dobranych przez niego wykluczy cudzysłów, ponieważ są one zamknięte w niewyspecjalizowanych przechwytywanie nawiasach (?: i ). Oczywiście musisz uciec z podwójnych cytatów do wykorzystania w kodzie C#.

Jeśli docelowy ciąg rozpoczyna się i/lub kończy na wartości cytowanej, to wyrażenie będzie również pasowało do pustych grup (dla początkowej i końcowej oferty).

2

Być może można spróbować zastąpić słowa wewnątrz cytatów z pustym ciągiem jak:

Regex r = new Regex("\".*?\"", RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Singleline); 
     string p = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET"; 

     Console.Write(r.Replace(p, "").Replace(" "," ")); 
4

Spróbuj regex:

\"[^\"]*\" 

Korzystając Regex.Matches tekstów w cudzysłów i użyć Regex.Split dla wszystkich innych słowa:

var strInput = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET"; 
var otherWords = Regex.Split(strInput, "\"[^\"]*\""); 
1

Jeśli sugerujesz, potrzebujesz wszystkich bloków zdanie - cytowane, a nie jedyne - wtedy istnieje prostszy sposób na oddzielenie łańcucha źródłowego za pomocą Regex. Podział:

static Regex QuotedTextRegex = new Regex(@"("".*?"")", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

var result = QuotedTextRegex 
       .Split(sourceString) 
       .Select(v => new 
        { 
         value = v, 
         isQuoted = v.Length > 0 && v[0] == '\"' 
        }); 
Powiązane problemy