Zalamování řádků regexem přináší neočekávané komplikace – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zalamování řádků regexem přináší neočekávané komplikace – .NET – Fórum – Programujte.comZalamování řádků regexem přináší neočekávané komplikace – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Matěj Andrle+1
Grafoman
25. 12. 2014   #1
-
0
-

Dobrý den,
mám cyklus, ve kterém přidávám tvrdé (jasné) nové řádky - pomocí Environment. Jenže tím mi na konci zůstane mezera a nový řádek - ve Windows \r\n. Než volat cyklus (string.Substring), či tak, raději bych to ignoroval regexem, kterým se snažím rozdělit řádek na hraničním slově - měkký enter. Jenže tato šablona - "(\r\n|\r|\n)" - nepřinesla kýžený výsledek. Pakliže jsem měl psolední slovo s čistým koncem, tak to nenašlo nic. Logika - přidal jsem $! "(\r\n|\r|\n|$)" Leč to funguje jen u čistého konce. U konce " \r\n" - tedy mezera + nový řádek + konec ($) jaksi stále dává prázdný řádek navíc. Tak jsem splodil toto: "(\r\n$|\r$|\n$|\r\n|\r|\n|$)", ovšem to přidalo dokonce řádek navíc... :D Tak mám raději umazat koncové " \r\n"?
Děkuji.

			for (int index = 0; index < Tabs.Count; index++)
				container.Text += Tabs[index].Title + " <" + index + "> " + Environment.NewLine; // zde to končí " \r\n"

....

				string line, currentPart = Text.Substring(start, currentMargin);
				Match newLine = Regex.Match(currentPart, "(\r\n$|\r$|\n$|\r\n|\r|\n|$)");

				if (newLine.Success)
					length = newLine.Index;
				else
				{
					length = currentPart.LastIndexOf(' ');

					if (length == -1)
					{
			            length = currentMargin;
						difference = 0;
					}
				}
Nahlásit jako SPAM
IP: 78.136.180.–
Kit+15
Guru
25. 12. 2014   #2
-
0
-

#1 Matěj Andrle
Zkus tohle 

"( *\r*\n*$)"

BTW: Proč to máš tak hluboko odsazené? To nevíš, že řádky nemají být delší než 80 znaků? Jak se v tom můžeš vyznat?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
25. 12. 2014   #3
-
0
-

#2 Kit
To jako nemám odsazovat namespace a class? Děkuji nechci - celý život odsazuji cokoliv uvnitř {} a vždy mi to usnadnilo život. Většinou publikovaný kód srazím, ale nyní jsem spěchal... Tvé řešení je vlastně stejné jako mé -> já však doufal, že se po nalezení shody s první možností (jedna|dvě|...) na ostatní vykašle... Zkrátka tvé řešení dělá prázdný řádek stejně jako mé. U čistého konce je to OK. (konec bez " \r\n") Ale u nečistého je tam řádek navíc...

Připojen obrázek.

Připojen obrázek.


Leč děkuji za snahu...

Nahlásit jako SPAM
IP: 78.136.186.–
Kit+15
Guru
25. 12. 2014   #4
-
0
-

#3 Matěj Andrle
Ale jo, odsazuj, ale není to důvod k tomu, abys měl řádky dlouhé 136 znaků. Víš, jak je to horizontální rolování nepříjemné, zejména u delších zdrojáků?

Vidím, že tam tu mezeru na konci zbytečně přidáváš. To neumíš zavolat metodu join()?

http://www.dotnetperls.com/string-join

Místo celé té parády udělej jen 

container.Text = string.Join(Environment.NewLine, Tabs);

a máš to.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
25. 12. 2014   #5
-
0
-

#4 Kit
Znovu - nemohu! Nemohu použít tento jednoduchý cyklus (schovaný uvnitř), poněvadž mám další 3 metody, které také naplňují texty do dialogu. A tyto metody již nejen, že shromažďují data z listu, což by šlo vzít přes Join, leč tyto metody dělají i další operace, na které potřebují znát index. A na pomocný List kašlu - to raději ten Substring... Jedna moje chyba je, že se nedívám na zbývající text - zda to nejsou již jen koncové serepetky. Ale tento ukázkový text je dost krátký na to, aby bylo jasné, že je chyba i v regexu... Breakpoint to jasně dokazuje:

"f <0> \r\n"

Regex to má vzít celé jako jeden řádek - má najít " \r\n$" - tak však nečiní...

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #6
-
0
-

#2 Kit
Opravuji se - tvá šablona dokonce nefunguje správně! Tvá šablona funguje stejně jako má jen u dialogů. U obyčejného textu (který není dále ošetřen) mi to hází prázdné řádky na nové - což můj ne - můj zabraňuje vzniku zbytečných odsazení, kdy musím půl hodiny scrollovat. Čily bych si s tím ještě pohoršil - v dialogu bych měl stále mezeru navíc a ještě u obyčejného textu měl miliardu prázdných řádků a uscrolloval bych se, než naleznu text.

Nahlásit jako SPAM
IP: 78.136.186.–
Kit+15
Guru
25. 12. 2014   #7
-
0
-

#6 Matěj Andrle
Nemohu za to, že si neumíš vyfiltrovat prázdné řádky. Také nemohu za to, že jsi nepochopil, že pak už tam žádný regex nebude, že je zbytečný.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
25. 12. 2014   #8
-
0
-

   

private void ShowLinks()
{
	Parent.ActiveIndex = 0;

	MessageBox container = new MessageBox
	{
		Height = 0.8F,
		OffsetTop = 1
	};

	for (int index = 0; index < Tabs[ActiveTab].Links.Count; index++)
		if (Tabs[ActiveTab].Links[index].Attributes.Contains("href"))
			container.Text += Tabs[ActiveTab].Links[index].Attributes["href"].Value + " <" + index + "> " + Environment.NewLine;

	if (container.Text == "")
		container.Text = "Sorry - there is no data.";

	container.Update();
	Parent.Controls.Add(container);
}

private void ShowTabs()
{
	Parent.ActiveIndex = 0;

	MessageBox container = new MessageBox
	{
		Height = 0.8F,
		OffsetTop = 1
	};

	for (int index = 0; index < Tabs.Count; index++)
		container.Text += Tabs[index].Title + " <" + index + "> " + Environment.NewLine;

	if (container.Text == "")
		container.Text = "Sorry - there is no data.";

	container.Update();
	Parent.Controls.Add(container);
}

private void ShowForms()
{
	Parent.ActiveIndex = 0;
	MessageBox container = new MessageBox
	{
		Height = 0.8F,
		OffsetTop = 1
	};

	for (int index = 0; index < Tabs[ActiveTab].Forms.Count; index++)
		container.Text +=
		(
			Tabs[ActiveTab].Forms[index].Attributes.Contains("name") ?
				Tabs[ActiveTab].Forms[index].Attributes["name"].Value :
			Tabs[ActiveTab].Forms[index].Attributes.Contains("title") ?
				Tabs[ActiveTab].Forms[index].Attributes["title"].Value :
			Tabs[ActiveTab].Forms[index].Attributes.Contains("id") ?
				Tabs[ActiveTab].Forms[index].Attributes["id"].Value : "Unspecified form"
		) + " <" + index + "> " + Environment.NewLine;

	if (container.Text == "")
		container.Text = "Sorry - there is no data.";

	container.Update();
	Parent.Controls.Add(container);
}
public void Update()
{
	int
				
		length, margin = (int)(width * Console.WindowWidth),
		tab = (Console.WindowWidth - (margin + 2 * Border.Length)) / 2;
	float fullLength = 2;

	Text = Regex.Replace(Text, "\t", "    ");

	Action writeText = delegate { WriteLine(tab, Border + Equally(" ", margin, TextAlign) + Border); };

	for (int start = 0; start < Text.Length; start += length)
	{
		int currentMargin = Math.Min(Text.Length - start, margin),
		difference = 1;

		string line, currentPart = Text.Substring(start, currentMargin);
		Match newLine = Regex.Match(currentPart, "(\r\n$|\r$|\n$|\r\n|\r|\n|$)");

		if (newLine.Success)
			length = newLine.Index;
		else
		{
			length = currentPart.LastIndexOf(' ');

			if (length == -1)
			{
			    length = currentMargin;
				difference = 0;
			}
		}

		line = Equally(Text.Substring(start, length), margin, TextAlign);
		writeText += delegate { WriteLine(tab, Border + line + Border); };
		fullLength++;
		start += Math.Max(newLine.Length - 1, difference);
	}

	writeText += delegate { WriteLine(tab, Border + Equally(" ", margin, TextAlign) + Border); wasWritten = 0; };

	this.writeText = writeText;

	float currentHeight = fullLength / Console.WindowHeight;

	if (height == 0 || currentHeight < height)
		height = fullLength > Console.WindowHeight ? 1 : currentHeight;

	linesCount = (int)fullLength;
}

Jak to mám tedy udělat jinak?

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #9
-
0
-

#7 Kit
Čti co píši - Regex je nezbytný, abych zalomil řádek podle currentMargin -> tedy podle krajů!


Nahlásit jako SPAM
IP: 78.136.186.–
Kit+15
Guru
25. 12. 2014   #10
-
0
-

#9 Matěj Andrle
Ty také nečteš, co ti píši. Klidně si to zarovnávej i podle okresů.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
25. 12. 2014   #11
-
0
-

#10 Kit
Jak z metody Join dostanu indexy? Jak? Napiš mi ten zázrak a budu tě považovat za boha... Potřebuji indexy do podmínky ke zvolení textu, který mám nastavit...

Nahlásit jako SPAM
IP: 78.136.186.–
Kit+15
Guru
25. 12. 2014   #12
-
0
-

#11 Matěj Andrle
Když to jde v PHP, musí to jít i v C#. Hledej trojici slov map, filter a reduce pro C#. Ty indexy si musíš vytáhnout ještě před slepením seznamu do stringu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
25. 12. 2014   #13
-
0
-

#12 Kit
Takže není jednodušší najít správný regex... :D Tak vysvětli proč to $ vezme a "\r\n$" ne... Mezeru vůbec neřeším - tou stejně čistím celou konzoli... (Pročež jsou všude.) Testovací string:

"f <0> \r\n"

Není důvod, aby byl na 2 řádky a přesto je.

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #14
-
0
-

#12 Kit
Tak jsem si na to musel zase přijít sám... :( :D Je to prosté - můj kód je zcela správný! Nepočítá jen s jednou vadou - velikost stringu neodpovídá navrácené hodnotě z vlastnosti Length - stačilo tedy dorovnat tento neduh a jede mi to dokonale... (Holt to nějaký string asi zobrazí blbě - když to vyjde zrovna na ten divný počet, ale zatím jsem na to nenarazil.)

Nahlásit jako SPAM
IP: 78.136.186.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý