# Text durchsuchen mit RegEx



## CopWorker (6. Oktober 2021)

Hallo zusammen, 

gibt es eine Möglichkeit mit RegEx folgenden String zu durchsuchen. 


```
IP-Address="192.168.0.0" Servername="UA Local Discovery Server" Rechnername="WG-DE-D11001DS" Comment="Lokaler OPC-UA Server" Type="SimaticNET.S7" Company="Coperion" IntValue='45'
```

Die Suche soll den gleichen Kriterien entsprechen wie es beim XML Parser erfolgt. 
Der Unterschied liegt darin, dass ich keine XML Datei lade (siehe nachfolgender Code) sondern die Zeilen einzeln aus einer Liste zur Verfügung habe.


```
XmlDocument xDoc = new XmlDocument();
xDoc.Load(strFilePath);
XmlNodeList name = xDoc.GetElementsByTagName("Storages");
```


Sodass es möglich ist nur die Attributliste zu durchforsten.


```
foreach (XmlAttribute xAttr in xn.Attributes) //Attribute auslesen
{
     switch (xAttr.Name)
     {
        case "IP-Address"
            break;
        
         case "Servername"
            break;
                                
    }
}
```

Vielen Dank. 
Grüße von CopWorker


----------



## Yaslaw (6. Oktober 2021)

```
(?<name>\b[\w-]+\b)=(?<delimiter>["'])(?<value>.*?)(?&delimiter)
```
Test mit regex101
Wie du die "Findings" in .NET auslesen kannst weiss ich nicht.


----------



## CopWorker (6. Oktober 2021)

Hallo Yaslaw, 

da meckert mein Compiler noch an der Stelle  ["'] mit der Beschreibung: 
Syntaxfehler. "," erwartet.

Der String sollte dann gesplittet werden und in einer Liste landen.


```
IP-Address="192.168.0.0"
Servername="UA Local Discovery Server"
Rechnername="WG-DE-D11001DS"
Comment="Lokaler OPC-UA Server"
Type="SimaticNET.S7"
Company="Coperion"
IntValue='45'
```

Die Findings sind kein Problem:
Code in .NET:
strRet = mTemp.Groups["name"].Value;
strRet = mTemp.Groups["value"].Value;

Grüße CopWorker


----------



## Yaslaw (6. Oktober 2021)

" innerhalb eines Strings musst du maskieren. Je nach Programierstprache mit "" (VB) oder \" (fast alle Anderen).


----------



## Yaslaw (6. Oktober 2021)

Apropos, regex101 kann C# erstellen
regex101: build, test, and debug regex

```
using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(?<name>\b[\w-]+\b)=(?<delimiter>[""'])(?<value>[(?<=\\).]*?)(?&delimiter)";
        string input = @"IP-Address=""192.168.0.0"" Servername=""UA Local Discovery\"" Server"" Rechnername=""WG-DE-D11001DS"" Comment=""Lokaler OPC-UA Server"" Type=""SimaticNET.S7"" Company=""Coperion"" IntValue='45'";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}
```


----------



## CopWorker (7. Oktober 2021)

Hallo Yaslaw, 

vielen Dank für die Hilfe. 
Leider wird hier während der Laufzeit eine Exception rausgeworfen.
Hier die Meldung: 
	
	
	



```
"(?<name>\b[\w-]+\b)=(?<delimiter>["'])(?<value>[(?<=\\).]*?)(?&delimiter)" wird analysiert - Unbekanntes Gruppierungskonstrukt.
```

Ich kann aber nicht erkenne an welcher Stelle der Fehler auftritt.

MfG. CopWorker


----------



## Yaslaw (7. Oktober 2021)

Was hast du überhaubt für eine Sprache? Ich kann keine der .NET. Aber für Andere wäre es sicher interessant, ob c#.NET, VB.NET oder sonstwas.


----------



## CopWorker (7. Oktober 2021)

Hallo Yaslaw, 

ich schreibe in C# mit .NET Framework 4.6.2 
Auch  regex101  führt bei mit nicht zum gewünschten Ergebnis: no match

mfG. CopWorker


----------



## Yaslaw (7. Oktober 2021)

Im regex101 ohne @"" testen.
regex101: build, test, and debug regex


----------



## CopWorker (7. Oktober 2021)

Hab´ ich auch schon weggelassen. 
Das gleiche Prpblem.


----------



## Yaslaw (7. Oktober 2021)

Bei RegEx191 kannst du dein Versuch speichern. Mach das und setze den Link hier ins Forum, dann sehe ich was du bastelst. Meine Links sind solche, da siehst du meine Tests.


----------



## CopWorker (8. Oktober 2021)

Hallo Yaslaw, 
erledigt. 
Saved RegEx

Grüße CopWorker


----------



## Yaslaw (8. Oktober 2021)

Du hast ein anderer Format als im Einleitungspost geschrieben. Klar passte mein Pattern nicht.
Der hier passt. Updated RegEx

```
(?<name>\b[ \w_-]+\b)\s*=\s*\\"(?<value>.*?)\\"
```


----------



## CopWorker (8. Oktober 2021)

Hallo Yaslaw, 
im RegEx101 Tester schon. 
Blos C# akzeptiert das pattern als string nicht.
Keine Ahnung warum.


```
string pattern = @"(?<name>\b[ \w_-]+\b)\s*=\s*\\"(?< value >.*?)\\"";
```

Die runde Klammern "(?<value>.*?)" passt dem Compiler nicht, erstmal.
Ohne '@' ist das gleiche Drama.


----------



## CopWorker (8. Oktober 2021)

Hallo Yaslaw,
alle zurück. 
Hab´ noch die Doppelten Hockkommas vergessen.

```
string pattern = @"(?<name>\b[ \w_-]+\b)\s*=\s*\\""(?<value>.*?)\\""";
```

Jetzt gibt zumindest der Compiler Ruhe.

Und so funktioniert es wirklich. Da werden die einzelnen Segmente (Name="Wert") in die Liste übernommen.

```
string pattern = @"(?<name>\b[ \w_-]+\b)\s*=\s*""(?<value>.*?)""";
```

Jetzt bleit nur noch der andere Typ von Wert zu erkennen.
Name="Wert als Text"
Name='Wert als Zahl'

Kann man das im Pattern verodern oder s.ä.?

Grüße CopWorker


----------



## CopWorker (8. Oktober 2021)

Hallo Yaslaw,
funktioniert auch mit den einfachen Hochkommas. [""']:

```
string pattern = @"(?<name>\b[ \w_-]+\b)\s*=\s*[""'](?<value>.*?)[""']";
```

Problem gelöst. 
Ich bin sehr erfreut. 
Das mit den RegEx101 war mir nicht bekannt. 
Ist aber ´ne große Hilfe.

Nochmals vielen Dank. 
Grüße von CopWorker


----------



## CopWorker (13. Oktober 2021)

Hallo Yaslaw, 

kann ich auch ohne die MultiLine Option gezielt nach einem Text suchen?

```
"<Storages IP=\"192.168.0.29\" Server=\"OPC.SimaticNET.S7OPT\" Computer=\"WG-DE-D11001DS\" Station=\"MIH-COMMON-0\" SPS=\"MIH-COMMON-0-PLC\" Object=\"OpcUa_MIH-COMMON-0-PLC\" Comment=\"Lokaler OPC-UA Server\" Type=\"SimaticNET.S7\" Company=\"Coperion\"   />"
```

Da möchte ich ich nur den Text " Object=\"OpcUa_MIH-COMMON-0-PLC\" selectieren.
Wobei vor und nach dem = Zeichen auch ein oder mehrere Leerzeichen stehen können.
Auch ist es möglich, dass vor "Object" und nach dem gesuchten Text mehrere Leezeichen erlaubt sind.

Ich habe es mit @"(?<= .?Object).*?(?=\s*[""'](?<value>.*?)[""'])"  versucht.

Funktioniert irgendwie nicht.

Vielen Dank für deine Hilfe
Gruß von CopWorker


----------



## Yaslaw (13. Oktober 2021)

Wozu die (?= ) und (?<= ). Das ist doch viel zu kompliziert.
`\bObject\s*=\s*(?<delimiter>["'])(?<value>.*?)\1`
regex101: build, test, and debug regex


----------



## CopWorker (13. Oktober 2021)

Hallo Yaslaw, 

hast recht, wozu die ?.
den delimiter musste ich noch erweitern, da C#. [""']
Funktioniert bestens. 

Vielen Dank, 
Grüße von CopWorker


----------

