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ň
|
Zaslal: 23. listopad 2011, 16:18:10 Předmět: Regulární výraz (word boundary) |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 23. listopad 2011, 16:28:28 Předmět: |
|
|
toto nefunguje?
#?\b(if|switch|case)\b _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 23. listopad 2011, 16:31:59 Předmět: |
|
|
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 |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 23. listopad 2011, 16:40:23 Předmět: |
|
|
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.
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 |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 23. listopad 2011, 18:28:52 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. listopad 2011, 20:14:31 Předmět: |
|
|
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
(PS: ne ze mi tu nekdo bude nadavat, co to je za prasarnu .. vim ze to je prasarna, ale pro nejaky jednoucel (nebo semestralku) nema cenu resit nejaky super mega namakany postup) _________________ Perry.cz |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 23. listopad 2011, 21:10:09 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. listopad 2011, 21:56:06 Předmět: |
|
|
Aha.. tak to bych tam tu cunarnu necpal
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 |
|
 |
Lemik
Založen: 30. 07. 2007 Příspěvky: 138
|
Zaslal: 24. listopad 2011, 06:54:36 Předmět: |
|
|
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 |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 24. listopad 2011, 12:19:51 Předmět: |
|
|
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...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 24. listopad 2011, 14:07:58 Předmět: |
|
|
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 |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 24. listopad 2011, 14:28:54 Předmět: |
|
|
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 |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 24. listopad 2011, 18:30:46 Předmět: |
|
|
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 |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 24. listopad 2011, 18:34:28 Předmět: |
|
|
Vyzkoušej, pokud se tam používá normální C preprocessor, tak to projde  _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 24. listopad 2011, 18:57:24 Předmět: |
|
|
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 |
|
 |
|