Avatar billede jonbdk Nybegynder
09. september 2009 - 08:23 Der er 2 kommentarer og
1 løsning

Match uden indre matches

(Koder i c#)
Jeg vil gerne finde ting mellem [!!! og !!!]
Eksempelvis [!!!min eksempel tekst!!!], og det har jeg lavet
[code]\[!!!(.*?)!!!\][/code] til, men jeg vil gerne undgå indre matches, eksempelvis: [code][!!!min eksempel[!!!smarte!!!] tekst!!!][/code] finder [code][!!!min eksempel[!!!smarte!!!][/code]Jeg gerne istedet gerne kun finde [code][!!!smarte!!!][/code]Så min tilgang var alt mellem[!!! og !!!] såfremt det ikke indeholdt [!!!
Det gav mig:
[code]pattern = \[!!!(.*?[^/[!!!].*?)!!!\][/code]
Men jeg kan ikke få det til at virke da jeg stadig finder det ydre match også
Avatar billede tjp Mester
09. september 2009 - 10:04 #1
Jeg vil tro at du bliver nødt til at matche hver mulig indlejring. Fx op til 3 niveauer:
\[!!!.*?\[!!!.*?\[!!!(.*?)!!!\].*?!!!\].*?!!!\]|\[!!!.*?\[!!!(.*?)!!!\].*?!!!\]|\[!!!(.*?)!!!\]
Avatar billede jonbdk Nybegynder
09. september 2009 - 11:36 #2
Hejsa
Tak for dit råd
Jeg besluttede istedet at overføre dem til en hashtable så jeg manuelt kan bestemme hvilke jeg vil gemme, for så at iterer flere gange i en while

Hashtable replacements = new Hashtable();
Regex reg = new Regex(@"\\[!!!(.*?)!!!\\]", RegexOptions.Singleline);
MatchCollection MatchList = reg.Matches(strInStr);
while (MatchList.Count > 0)
{
  replacements.Clear();
  for (int i = 0; i < MatchList.Count; i++)
  {
    string thisMatch = MatchList[i].ToString();
    if (thisMatch.IndexOf("[!!!", 1) < 0)
    {
      if (!replacements.Contains(thisMatch))
      {
        replacements.Add(thisMatch, null);
      }
    }
  }
  IDictionaryEnumerator _enum = replacements.GetEnumerator();
  StringBuilder builder = new StringBuilder(strInStr);
  while (_enum.MoveNext())
  {
    string thisMatch = _enum.Key.ToString();
    builder.Replace(thisMatch, TranslateItem(thisMatch, userLang));
  }
  strInStr = builder.ToString();
  MatchList = reg.Matches(strInStr);
}


Det gør det nok mere til en c# løsning end en regexp, og sandsynligvis lidt sløvere end hvis jeg kunne gøre det med ren regexp.
Din idé er også god, men besluttede på denne måde at have lidt mere kontrol. Hvis du smider et svar deler vi i porten :)
/Jon
Avatar billede tjp Mester
09. september 2009 - 12:32 #3
Here U R.. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester