2012-02-03 11 views
6

Mam poniższy kod, który działa dla pojedynczych cudzysłowów. znajduje wszystkie słowa między pojedynczymi cudzysłowami. ale w jaki sposób zmodyfikowałbym wyrażenie regularne do pracy z podwójnymi cudzysłowami?Regex.Matches C# podwójne cytaty

kluczowych pochodzi z formularza postu

tak

keywords = 'peace "this world" would be "and then" some' 


    // Match all quoted fields 
    MatchCollection col = Regex.Matches(keywords, @"'(.*?)'"); 

    // Copy groups to a string[] array 
    string[] fields = new string[col.Count]; 
    for (int i = 0; i < fields.Length; i++) 
    { 
     fields[i] = col[i].Groups[1].Value; // (Index 1 is the first group) 
    }// Match all quoted fields 
    MatchCollection col = Regex.Matches(keywords, @"'(.*?)'"); 

    // Copy groups to a string[] array 
    string[] fields = new string[col.Count]; 
    for (int i = 0; i < fields.Length; i++) 
    { 
     fields[i] = col[i].Groups[1].Value; // (Index 1 is the first group) 
    } 
+0

nie będzie pracować, aby umieścić cytaty w ciągu? @ -strings użyć "" zamiast \ "do cytatów.' @ "" "(. *?)" "" ' –

Odpowiedz

13

należy po prostu wymienić ' z \" i usunąć dosłowne, aby go odtworzyć poprawnie.

MatchCollection col = Regex.Matches(keywords, "\\\"(.*?)\\\""); 
+0

Nie ma potrzeby ucieczki' '' w regex. –

+0

prefekt. i jeśli chcę uwzględnić cudzysłowy w łańcuchu? – user713813

+0

@ user713813: Przenieś nawiasy (jak również znacznik _nongreedy_) na odpowiednie końce łańcucha. – Nuffin

8

Dokładnie tak samo, ale z podwójnymi cudzysłowami zamiast pojedynczych cudzysłowów. Podwójne cudzysłowy nie są specjalne w schemacie regex. Ale zazwyczaj coś dodać, aby upewnić się, że nie jestem obejmujących accross wielu cytowanych ciągów w jednym meczu, aby pomieścić double-double cytat ucieka:

string pattern = @"""([^""]|"""")*"""; 
// or (same thing): 
string pattern = "\"(^\"|\"\")*\""; 

co przekłada się na literalnym ciągiem

"(^"|"")*" 
3

pomocą tego wyrażenia regularnego:

"(.*?)" 

lub

"([^"]*)" 

W języku C#:

var pattern = "\"(.*?)\""; 

lub

var pattern = "\"([^\"]*)\""; 
2

Chcesz dopasować " lub '?

w takim przypadku możesz zrobić coś takiego:

[Test] 
public void Test() 
{ 
    string input = "peace \"this world\" would be 'and then' some"; 
    MatchCollection matches = Regex.Matches(input, @"(?<=([\'\""])).*?(?=\1)"); 
    Assert.AreEqual("this world", matches[0].Value); 
    Assert.AreEqual("and then", matches[1].Value); 
} 
Powiązane problemy