---
title: "Problem med Regex"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/184232-problem-med-regex"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "saw"
published: "2010-08-02T19:43:09.000Z"
updated: "2010-08-03T18:47:43.000Z"
replies: 13
views: 758
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/184232-problem-med-regex"
---

# Problem med Regex

## #1 — saw, 2010-08-02T19:43Z

Jag måste tyvärr besvära er igen.
Jag har en stor textfil(ca 3 mb) som i stort ser ut så här.

```
"abilities_effect_text_can_assassinate"	"Can undertake assassination missions."	"False"
"abilities_effect_text_can_attack_land"	"Can instigate land battles."	"False"
"abilities_effect_text_can_attack_naval"	"Can instigate naval battles."	"False"
"abilities_effect_text_can_build_fort"	"Can construct fort."	"False"
"abilities_effect_text_can_build_religious"	"Can construct mission."	"False"
```

I första steget så ville jag läsa in det som står mellan de två första cittattecknen(").
Jag försöker så här

```
 Regex exp = new Regex("?????",RegexOptions.IgnoreCase);//<---här vet jag inte
            MatchCollection MatchList = exp.Matches(filnamnet);
            Match FirstMatch = MatchList[0];
            Group GroupCurrent;
            for (int i = 1; i < FirstMatch.Groups.Count; i++)
            {
                GroupCurrent = FirstMatch.Groups[i];
                if (GroupCurrent.Success)
                {
                    comboBox1.Items.Add(GroupCurrent.Value);
                }

            }
```

Problemet är att jag inte vet hur jag skall skriva min regex för att enbart ha
med det första blocket( det finns alltid tre block). Hur jag sen skall fortsätta
det är jag osäker på, men jag tror det ger sig.
För övrigt så tror jag att jag är på rätt väg, eller...

Permalänk: https://www.webforum.nu/p/184232

## #2 — GunnarD, 2010-08-02T20:05Z

Borde fungera med /\\"(.\*?)\\"/ för att få första delen.

Regex är normalt "greedy" och vill ta så mycket som möjligt, men om man sätter ett frågetecken efter \* så blir uttrycket "non greedy".

Ex:

```
apapa med uttrycket a.*a matchar apapa
apapa med uttrycket a.*?a matchar apa
```

Permalänk: https://www.webforum.nu/p/2247035

## #3 — voigtann1, 2010-08-02T20:07Z

är det varje rad du är intresserad över?

eller är det varje citat?:

```
"\"[^\"]+\""
```

 är din sträng för att fånga alla, om det inte är så att det kan vara så att den innehåller:

"hej \\"test\\"" i din text fil? då kan: 

```
"\".*?\""
```

passar dig bättre?

Permalänk: https://www.webforum.nu/p/2247036

## #4 — saw, 2010-08-02T20:27Z

I första läget ville jag ha ut det första blocket i varje rad.
Det verkar dessvere som om min kod är galen jag får följande error:
***Det angivna argumentet hamnade utanför intervallet med giltiga värden.
Parameternamn: i***
Oavsett vilket av era förslag som jag försöker med.

Permalänk: https://www.webforum.nu/p/2247040

## #5 — voigtann1, 2010-08-02T20:39Z

Uttrycket är korrekt om det är alla citat du vill få ut.

```
MatchCollection allMatchResults = null;
try {
	Regex regexObj = new Regex("\".*?\"", RegexOptions.IgnoreCase);
	allMatchResults = regexObj.Matches(subjectString);
	if (allMatchResults.Count > 0) {
		// Access individual matches using allMatchResults.Item[]
	} else {
		// Match attempt failed
	} 
} catch (ArgumentException ex) {
	// Syntax error in the regular expression
}
```

säger regexpbuddy i c# att det kan se ut.

Permalänk: https://www.webforum.nu/p/2247042

## #6 — saw, 2010-08-02T20:48Z

Nu är jag troligen väldigt dum , men jag behöver ladda en combobox med det.

```
if (allMatchResults.Count > 0)
                {
                    // Access individual matches using allMatchResults.Item[]
                    comboBox1.Items.Add(allMatchResults.text);
                }
```

Här händer ingenting...

Permalänk: https://www.webforum.nu/p/2247044

## #7 — voigtann1, 2010-08-02T20:55Z

är allMatchResults.Count 0?

Permalänk: https://www.webforum.nu/p/2247045

## #8 — saw, 2010-08-02T21:02Z

Japp, ja la in en messagebox och kollade..
FEL AV MIG.
Nu får jag 
System.Text.RegularExpressions.MatchCollection

Jag gör allstå fel när jag skall ladda comboboxen.(se ovan).

Permalänk: https://www.webforum.nu/p/2247046

## #9 — saw, 2010-08-02T21:28Z

Nu har jag ändrat en del och jag har fått första raden, men hur fortsätta så
 jag får med alla?

```
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
            MatchCollection MatchList = exp.Matches(allRead);
            Match FirstMatch = MatchList[0];
            Group GroupCurrent;
            for (int i = 0; i < FirstMatch.Groups.Count; i++)
            {
                GroupCurrent = FirstMatch.Groups[i];
                
                if (GroupCurrent.Success)
                {
                    comboBox1.Items.Add(GroupCurrent.Value);
                }

            }
```

Permalänk: https://www.webforum.nu/p/2247048

## #10 — voigtann1, 2010-08-02T21:44Z

```
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
```

Permalänk: https://www.webforum.nu/p/2247049

## #11 — saw, 2010-08-02T22:00Z

Tyvärr så hjälpte inte det heller :-(

Permalänk: https://www.webforum.nu/p/2247050

## #12 — Brimba, 2010-08-03T06:27Z

Det borde vara något i stil med

```
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
            MatchCollection MatchList = exp.Matches(allRead);
            foreach (Match match in MatchList){
            Group GroupCurrent;
            for (int i = 0; i < match.Groups.Count; i++)
            {
                GroupCurrent = match.Groups[i];
                
                if (GroupCurrent.Success)
                {
                    comboBox1.Items.Add(GroupCurrent.Value);
                }

            }
}
```

Men eftersom du bara är ute efter en specifik grupp så borde det räcka med typ

```
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
            MatchCollection MatchList = exp.Matches(allRead);
            foreach (Match match in MatchList){
 if (match.Groups[1].Success){
                  comboBox1.Items.Add(match.Groups[1].Value);
  
}
  }
```

Permalänk: https://www.webforum.nu/p/2247056

## #13 — saw, 2010-08-03T14:26Z

Hej Brimba.
Jag har testat dina bägge förslag, och de lägger till i comboboxen, men de lägger till allt.
Jag blev tvungen att ändra lite för att få någon text alls

```
 Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
            MatchCollection MatchList = exp.Matches(allRead);
            foreach (Match match in MatchList)
            {
                if (match.Groups[0].Success)
                {
                    comboBox1.Items.Add(match.Groups[0].Value);
                }
            }
```

Texten ser ju ut så här:

```
"abilities_effect_text_can_assassinate"	"Can undertake assassination missions."	"False"
"abilities_effect_text_can_attack_land"	"Can instigate land battles."	"False"
"abilities_effect_text_can_attack_naval"	"Can instigate naval battles."	"False"
"abilities_effect_text_can_build_fort"	"Can construct fort."	"False"
"abilities_effect_text_can_build_religious"	"Can construct mission."	"False"
"abilities_effect_text_can_convert"	"Enables religious conversion."	"False"
```

.. och då är det bar t ex

```
"abilities_effect_text_can_assassinate"
"abilities_effect_text_can_attack_land"
"abilities_effect_text_can_attack_naval" //osv
```

.. som jag vill ha i comboboxen.

Permalänk: https://www.webforum.nu/p/2247065

## #14 — saw, 2010-08-03T18:47Z

Den första delen har jag lyckats att klara ut, tyvärr inte med regex men..

```
Application.DoEvents();
            int counter = 0;
            string line;
            try
            {
                StreamReader file = new StreamReader(filnamnet);
                while ((line = file.ReadLine()) != null)
                {
                    searthText = line.Split('"');
                    comboBox1.Items.Add(searthText[1]);
                    counter++;
                    Application.DoEvents();
                }
                file.Close();
                Application.DoEvents();
            }
            catch(Exception fel)
            {
                MessageBox.Show(fel.Message);
            }
            finally
            {
                toolStripStatusSum.Text = counter.ToString();
            }
```

Nu får jag det snyggt och prydligt. Nästa bit kräver nog regex, då skall jag
kunna klicka i comboboxen och få upp den nästföljande text i en textbox.
Tips???
\[REDIGERAT\]
Jag har nu fått allting att fungera dock inte med regex utan gammal hederlig strängmanupilation.
Jag tänkte visa er, den ovan koden fungerar bra, sedan

```
//när comboboxen ändras
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex > -1)
            { 
               int i = comboBox1.SelectedIndex + 1;
               textBox1.Text = readLine(filnamn,i);
            }
            else
                MessageBox.Show("Inget index");
        }
//..så visar jag upp den här
 private static string readLine(string filnamn,int lineNr)
        {
            string sText = "";
            using (StreamReader sr = new StreamReader(filnamn))
                for (int i = 0; i < lineNr; i++)
                {
                    sText = sr.ReadLine();
                    if (sText == null) break; 
                }
            string[] newText = sText.Split('"');
            return newText[3];
        }
```

Totalt så är det 33023 rader. Frågan är nu, i textfilen så är ju allt omgivna av citterationstecken, skall jag göra det i comboboxen och i textboxen.
Sen det viktigaste hur skall jag spara, när jag har plockat fram ett radnummer och ändrat det?
Väldigt tacksam för alla tips.

Permalänk: https://www.webforum.nu/p/2247093

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/184232-problem-med-regex
