2012-10-23 21 views
25

Chcę wyodrębnić tylko te słowa w podwójnych cudzysłowach. Tak więc, jeśli treść jest:Regex: C# wyodrębnij tekst w podwójnych cudzysłowach

Czy "Ty" chciałbyś otrzymywać odpowiedzi na swoje "pytania" wysłane przez e-mail?

Odpowiedź musi być

  1. wy
  2. pytania
+1

Czy spodziewasz się wycinków z cudzysłowami w ramach notowanych ciągów znaków? Jak w "Jestem" 5'7 \ "" wysoki "? –

Odpowiedz

43

Spróbuj regex:

\"[^\"]*\" 

lub

\".*?\" 

wyjaśnić:

[^ character_group ]

Negacja: dopasowuje dowolny pojedynczy znak spoza grupy character_group.

*?

zestawienia poprzedni element zero lub więcej razy, ale kilka razy, jak to możliwe.

i przykładowy kod:

foreach(Match match in Regex.Matches(inputString, "\"([^\"]*)\"")) 
    Console.WriteLine(match.ToString()); 

//or in LINQ 
var result = from Match match in Regex.Matches(line, "\"([^\"]*)\"") 
      select match.ToString(); 
10

podstawie @Ria „s odpowiedź:

static void Main(string[] args) 
{ 
    string str = "Would \"you\" like to have responses to your \"questions\" sent to you via email?"; 
    var reg = new Regex("\".*?\""); 
    var matches = reg.Matches(str); 
    foreach (var item in matches) 
    { 
     Console.WriteLine(item.ToString()); 
    } 
} 

wyjście jest:

"you" 
"questions" 

Można użyć string.TrimStart() i string.TrimEnd(), aby usunąć podwójne cudzysłowy, jeśli nie chcesz tego.

7

Podoba mi się rozwiązanie do regex. Można również pomyśleć o coś takiego

string str = "Would \"you\" like to have responses to your \"questions\" sent to you via email?"; 
var stringArray = str.Split('"'); 

następnie podjąć odd elementy z tablicy.Jeśli używasz LINQ, można zrobić to tak:

var stringArray = str.Split('"').Where((item, index) => index % 2 != 0); 
2

ten kradnie również regex z @Ria, ale pozwala uzyskać je do tablicy, gdzie następnie usunąć cytaty:

strText = "Would \"you\" like to have responses to your \"questions\" sent to you via email?"; 
MatchCollection mc = Regex.Matches(strText, "\"([^\"]*)\""); 
for (int z=0; z < mc.Count; z++) 
{ 
    Response.Write(mc[z].ToString().Replace("\"", "")); 
} 
0

musiałem to zrobić w C# do analizowania CSV i żaden z nich nie pracował dla mnie, więc wymyśliłem to:

\s*(?:(?:(['"])(?<value>(?:\\\1|[^\1])*?)\1)|(?<value>[^'",]+?))\s*(?:,|$) 

to będzie analizować obecnie pola z lub bez cudzysłowów i wykluczy cytaty z wartością z zachowaniem wbudowanego q uotes i przecinki. <value> zawiera przeanalizowaną wartość pola. Bez użycia nazwanych grup, grupa 2 lub 3 zawiera wartość.

Dostępne są lepsze i bardziej wydajne sposoby na przetwarzanie CSV, a to nie będzie skuteczne w identyfikowaniu błędnych danych wejściowych. Ale jeśli masz pewność, że Twój format wejściowy i wydajność nie stanowią problemu, może to zadziałać.

Powiązane problemy