[C#] Regex multilines

0

Witam,
potrzebuje zamienić taki łańcuch

[tag]jeden\r\ndwa[/tag][/code]
na coś takiego[code]<NewTag>(wszystko co znajduje się między tymi tagami razem z nowymi liniami)</NewTag>

próbowałem w ten sposob

string x = Regex.Replace("[tag]jeden\r\ndwa[/tag]", @"\[tag\](.*?)\[/tag\]", "<NewTag>$1</NewTag>");

ale niestety ten fragment (.*?) działa tylko dla jednej lini i nie obsługuje entera tak więc jak można to inaczej zapisać aby wyłapało również znaki nowych linii?

0

Z tego co zrozumiałem z Twojej pogmatwanej wypowiedzi, to chcesz zmienić taki ciąg znaków:
[tag]jeden\r\ndwa[/tag]na taki:<NewTag>jeden\r\ndwa</NewTag>.
A więc wystarczy tak naprawdę zmienić wygląd i nazwy tagów. Jeśli chodziło Ci o to, to wystarczy coś takiego:

string text = @"[tag]jeden\r\ndwa[/tag]";
            Console.WriteLine(text.Replace("[tag]", "<NewTag>").Replace(@"[/tag]", "</NewTag>"));

Jeśli nie, to musisz bardziej sprecyzować :-P

0

string x = Regex.Replace("[tag]jeden\r\ndwa[/tag]", @"([tag])+(][^[])([/tag])", "<NewTag>$2</NewTag>");

pod $1 jest [tag]
pod $2 jest jeden\r\ndwa
pod $3 jest [/tag]

0

Jeśli dobrze zrozumiałem to odpowiedzią na twój problem jest opcja Singleline. Wtedy . (kropka) łapie każdy znak (a nie każdy znak z wyjątkiem Entera).

Za dokumentacją:

Singleline - Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n).

0

Singleline rozwiazalo problem a czy wiecie może jak można podczas Replace oznaczyć aby dany znak mimo iż został znaleziony w ciągu nie został usunięty po podmianie ze swojego miejsca?
np. w abcdef zamieniam replace("abcdef", @"cde", "xxx") wynik tego jest ostatecznie taki abxxxf a ja chce aby byl abxxef, da sie to zrobic? za pomoca jednego wyrazenia aby jakos zaznaczyć przy "e" aby nie usuwał przy podmianie?

0

A to nie możesz wyszukać tylko cd i zamieniać na xx ? Ale możesz zrobić, że tę ostatnią literę dasz w nawiasy a potem chyba w replace możesz użyć back referencji. Dokładnie nie pamiętam, ale jakoś tak to było:

regex.Replace("abcdef","cd(e)",@"xx\1")
Ale główny nie daję, że back referencje działają w Replace.

0
Regex.Replace("abcdef", "cd(e)", "xx$1"); // backreference
Regex.Replace("abcdef", "cd(?<!e)", "xx"); // zero-width (dlatego nie zostanie zastępiony) negative lookbehind
0

Mysłałem że negative lookbehind juz rozwiąże mój problem ale jednak dalej coś nie wychodzi(brakuje dokładnie jednego znaku który ucina) opisze dokładnie z czym mam problem, mam do zamiany taką strukture:
[list][*]jeden\r\n[*]dwa\r\n[*]trzy[/list] z tym że ta struktura może wyglądać równie dobrze tak:
[list][*]jeden[*]dwa[*]trzy[/list] albo w ogóle tak
[list]\r\n[*]jeden\r\n[*]dwa\r\n[*]trzy\r\n[/list] i staram się napisać jakieś wspólne wyrażenie dla tych przypadków, a poki co nie moge nawet pierwszego napisać bo brakuje w nim jednego znaku czyli to

[list][*]jeden\r\n[*]dwa\r\n[*]trzy[/list]
chce zamienić na
<List><ListItem><Paragraph>jeden</Paragraph></ListItem><ListItem><Paragraph>dwa</Paragraph></ListItem><ListItem><Paragraph>trzy</Paragraph></ListItem></List>

więc próbuje najpierw zamienić to co najłatwiej

s1 = "[list][*]jeden\r\n[*]dwa\r\n[*]trzy[/list]";
            Regex rex = new Regex(@"\[list\](.*?)\[/list\]", RegexOptions.Singleline);
            string x = rex.Replace(s1, "<List>$1</List>");

a później

x = Regex.Replace(x, @"\[\*\](.*?)[\r\n(?<!\<)]", "<ListItem><Paragraph>$1</Paragraph></ListItem>");

ostatecznie otrzymuje juz prawie to co chciałem osiągnać w 1szym przypadku:

<List><ListItem><Paragraph>jeden</Paragraph></ListItem>
<ListItem><Paragraph>dwa</Paragraph></ListItem>
<ListItem><Paragraph>trzy</Paragraph></ListItem>/List>

jak widać nie ma "<" przy zamykającym tagu List, a może da się to po prostu jeszcze łatwiej zrobić jednym wyrażeniem? mam z tym problem ponieważ [*] nie ma tagu zamykającego kończy się albo "\r\n" albo "<" lub "[" i nijak nie moge napisac pod ta strukture wyrażenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1