.[ ČeskéHry.cz ].
Regulární výraz (word boundary)
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 23. listopad 2011, 16:18:10    Předmět: Regulární výraz (word boundary) Odpovědět s citátem

Zdravím,

potřeboval bych poradit s regulárními výrazy.
Vyhledávám v textu klíčová slova pro syntax coloring, jenže jsem narazil na problém, hash mark (#) nepaří mezi písmena tvořící slova, ale já potřebuji detekovat příkazy preprocesoru (#ifdef, apod.)

Regulární výraz (ve zjednodušené formě) mám takto:
kód:

\b(if|switch|case)\b

Ten výtaz je samozřejmě delší a obsahuje všechna slova, která chci obarvovat.
Jak by měl vypadat regulární výraz, pokud chci brát ta slova i s #.
Nešlo by nějak rozšířit znaky, které ten Regex bere jako ty, která tvoří slova?
Moc by mi to pomohlo...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 23. listopad 2011, 16:28:28    Předmět: Odpovědět s citátem

toto nefunguje?

#?\b(if|switch|case)\b
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 23. listopad 2011, 16:31:59    Předmět: Odpovědět s citátem

Důležitá otázka - pro jakou knihovnu na regulární výrazy to je? Ale všechny co znám, umožňují zadat libovolný znak přes escapování (např. \#, případně přes numerický kód).

Ale jinak na tohle obarvování je lepší napsat si jednoduchý tokenizer, protože ty regulární výrazy budeš muset složitě ošetřovat (aby správně zpracovaly třeba komentáře).
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 23. listopad 2011, 16:40:23    Předmět: Odpovědět s citátem

Píši to v C#, tam je nějaký Regex...
Tokenizer jsem už dělal, ale tohle je rychlejší.
Komenty mám stejně v plánu udělat v druhém průchodu...

To co psal nou jsem už také zkoušel, ale nou nou. Very Happy

Edit: Já potřebuji, aby to správně hledalo, když ten regex bude vypadat takhle:
kód:

\b(if|else|#ifdef|#define|class|struct)\b

_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 23. listopad 2011, 18:28:52    Předmět: Odpovědět s citátem

To fakt nikdo nemá žádný nápad?
Já bych to vážně moc potřeboval...
Co třeba nějaký ekvivalentní zápis \b nebo podstrčení větší sady znaků...
Já regulární výrazy moc neumím...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 23. listopad 2011, 20:14:31    Předmět: Odpovědět s citátem

A něco jako
\b(if|else|\#define)\b nejde ? (nebo else|[\#define])

Popřípadě můžeš udělat monstr cunarnu (pokud je to na jednou pouziti) a dat na tom stringu replace #define, XXdefine a pak to XXdefine vrazit do toho regularu normalnim zpusobem Smile
(PS: ne ze mi tu nekdo bude nadavat, co to je za prasarnu Very Happy.. vim ze to je prasarna, ale pro nejaky jednoucel (nebo semestralku) nema cenu resit nejaky super mega namakany postup)
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 23. listopad 2011, 21:10:09    Předmět: Odpovědět s citátem

Děkuji za snahu, ale ani jedno nejde a tomu brute/ugly force bych se chtěl vyhnout...

Edit: Btw. je to na PRJ5 (což je zakuklená bakalářka)...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 23. listopad 2011, 21:56:06    Předmět: Odpovědět s citátem

Aha.. tak to bych tam tu cunarnu necpal Smile

Co zkusit jako parametr toho Regexu, protože se zdá, že # je v C# vyhrazený pro komenty uvnitř regex vyrazu (nebo jsem to někde viděl):
RegexOptions.IgnorePatternWhitespace - Eliminates unescaped white space from the pattern and enables comments marked with the hash sign (#).

Jinak různé možnosti co jsou vyhrazená slova:
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Lemik



Založen: 30. 07. 2007
Příspěvky: 138

PříspěvekZaslal: 24. listopad 2011, 06:54:36    Předmět: Odpovědět s citátem

Word (slovo) je tvořeno z word characters ( \w ), což jsou znaky [A-Za-z0-9_] - znak # mezi nimi není.

Word boundaries ( \b ) Ti najde "krajní znak" toho slova, tedy kde slovo "sousedí" s jiným znakem, ať už s mezerou, whitespace či různými znaky, nebo začátkem/koncem textu/řádku.


Znak # tak tedy nemůžeš dát mezi word boundaries, musíš ho dát před. Takže teď vlastně hledáš dvě skupiny slov - jedny předchází znak #, ty druhé ne.

#\b(define|if|else|endif|region)\b|\b(switch|while|if|else|void)\b




(miluju barvičky)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 24. listopad 2011, 12:19:51    Předmět: Odpovědět s citátem

Rád bych řekl, že to funguje, ale opak je pravdou...
To musí být nějaký deep magic v C# regexech.

Ještě s tím zkusím zaexperimentovat, třeba na něco přijdu.

Mockrát děkuji.

Edit:
Zkusil jsem tam dát regex takový:
kód:

[#]\b(define|ifdef|ifndef|pragma)\b|\b(if|case|void|int|while)\b

tak se to chovalo tak, že vše, co začíná # není obarvené a obarví se jen ten krížek... Rolling Eyes
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 24. listopad 2011, 14:07:58    Předmět: Odpovědět s citátem

Tak jsem to nakonec rozfungoval. Bylo to v tom, že jsem si nevšiml, že tam může být i 2x # (##), takže jsem to tam vecpal natvrdo a funguje to...
Ještě musím vyřešit, že za # a ## musí být bílý znak, aby to správně zobrazovalo vše...
Hurá...

Zatím to mám takhle:
kód:

\#\b(ifdef|define|undef)\b|\b(if|case|switch)\b|\#|\#\#


Edit:
Ale zvažui možnost napsat si nějaký krutopřísný tokenizer...uvidíme.
Moc děkuji.
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 24. listopad 2011, 14:28:54    Předmět: Odpovědět s citátem

Tak kdyz uz to funguje... zvladne to spravne obarvit tohle?
kód:
#     ifdef bla
#  /* hello world, this also
compiles */    endif

(v C/C++ mezi krizkem a klicovym slovem muze klidne byt libovolny pocet mezer, tabu a nebo viceradkovy komentar).
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 24. listopad 2011, 18:30:46    Předmět: Odpovědět s citátem

Ne. To ti mohu říci rovnou.
Já obarvuji glsl kód, jestli to tam funguje stejně jako v C, to opravdu nevím...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 24. listopad 2011, 18:34:28    Předmět: Odpovědět s citátem

Vyzkoušej, pokud se tam používá normální C preprocessor, tak to projde Wink
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 24. listopad 2011, 18:57:24    Předmět: Odpovědět s citátem

V GLSL, co jsem tak zkoušel, musí být # a odpovídající slovo preprocessoru na jednom řádku a nesmí být mezi tím komentář. Můžou tam být mezery...
Zkoušel jsem tam nakopírovat, to co jsi napsal a nelíbilo se mu endif bez #.
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna