2012-10-23 11 views
25

Voglio estrarre solo quelle parole tra virgolette. Quindi, se il contenuto è:Regex: C# estratto il testo tra virgolette

"Vorresti ricevere risposte alle tue" domande "inviate via email?

La risposta deve essere

  1. voi
  2. domande
+1

Ti stai aspettando citazioni sfuggite all'interno delle stringhe quotate? Come in "I am" 5'7 \ "" tall'? –

risposta

43

Prova questo regex:

\"[^\"]*\" 

o

\".*?\" 

spiegare:

[^ character_group ]

Negazione: corrisponde a qualsiasi singolo carattere che non è in character_group.

*?

corrispondente all'elemento precedente zero o più volte, ma il minor numero di volte possibile.

e un codice di esempio:

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

in base alla risposta @Ria s':

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()); 
    } 
} 

L'output è:

"you" 
"questions" 

È possibile utilizzare string.TrimStart() e string.TrimEnd() per rimuovere le virgolette doppie se non lo si desidera.

7

Mi piacciono le soluzioni regex. Si potrebbe anche pensare a qualcosa di simile

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

poi prendere la odd elementi dell'array.Se si utilizza LINQ, si può fare in questo modo:

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

Questa ruba anche il Regex da @Ria, ma consente di ottenere loro in una matrice in cui è quindi rimuovere le virgolette:

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

avevo bisogno di fare questo in C# per il parsing CSV e nessuno di questi ha lavorato per me, così sono arrivato fino a questo:

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

Ciò analizzare fuori un campo con o senza virgolette e si escludono le citazioni dal valore pur mantenendo incorporato q uote e virgole. <value> contiene il valore del campo analizzato. Senza utilizzare i gruppi con nome, il gruppo 2 o 3 contiene il valore.

Esistono modi migliori e più efficienti per eseguire l'analisi CSV e questo non sarà efficace nell'individuare input non validi. Ma se puoi essere sicuro del tuo formato di input e delle prestazioni non è un problema, questo potrebbe funzionare per te.

Problemi correlati