[c#] Regexp probleempje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Hoi, ik had gister ook al topic geopend hierover, maar dat was terecht gesloten omdat ik door tijdnood wat dingen was te verhelderen, ik heb de volgende situatie, via het CMS kunnen redacteuren artikelen aanmaken, 1 van de specs is dat wanneer het artikel wat langer is, er boven het artikel automatisch anchors verschijnen naar anchors in de text.

Een voorbeeld tekst kan zijn:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<div id="lipsum">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ... ultrice<a id="Plopperde plop"
name="Plopperde plop"></a>s felis quis pellentesque. ... montes, <a id="Dit is een tekst"
name="Dit is een tekst"></a>nascetur ridiculus mus.</p>

<blockquote>
<p>Nulla id erat... ipsum eleifend.</p>
</blockquote>

<p>Donec luctus libero sed ... lorem eget nibh <a
id="Hop paardjehop" name="Hop paardjehop"></a>sodales lacinia nec
eget ... ipsum a orci.</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<?UMBRACO_MACRO macroAlias="InlineGraph" onderschrift="Dit
is een onderschrift" graph="1107" /> 

<p>&nbsp;</p>

<p>Mauris ac nibh ... sem a ultrices.</p>

<ol>
<li>dit is de eerste</li>

<li>en nummer 2</li>

<li>en de laatste</li>
</ol>

<p>hasellus ut est purus..amet metus.</p>
</div>


In deze tekst staan dus 4 anchors, 1 daarvan is bijvoorbeeld:

code:
1
<a id="Hoi een Anchor" name="Hoi een Anchor"></a>


Mijn idee was om via een Regex de anchors eruit te halen, en op basis hiervan een linklist te generen, na wat gerommel dacht ik de juist Regex te hebben, tenminste mijn tool Expresso, geeft de juiste matches aan, met de volgende Regexp:

code:
1
2
3
4
5
6
7
8
9
10
        string artikeltekst = Node.GetCurrent().GetProperty("artikel").Value;
//Dit is de RegEx die Expresso aangeeft en de 4 matches geeft
        Regex regex = new Regex(
            @"<a id="".*?"" name="".*?""></a>",
            RegexOptions.IgnoreCase
            | RegexOptions.Multiline
            );

        MatchCollection matches = regex.Matches(artikeltekst);
        xxx.Text = matches.Count.ToString();


Echter als ik deze code in mijn pagina gebruik, krijg ik geen matches terug, ik heb getest of de artikeltekst juist is, maar dat gaat gewoon goed.

Ik zit behoorlijk vast, en snap er helemaal niets meer van :(

[ Voor 49% gewijzigd door MueR op 02-12-2010 16:22 . Reden: Even heel veel lorem ipsum gestript ]


Acties:
  • 0 Henk 'm!

  • vbmot
  • Registratie: April 2003
  • Laatst online: 28-07 08:44
Heb je in C# misschien een DOTALL mode net als in Java? DOTALL specificeert dat '.' ook newline characters matcht.

Ook maar dat ik dat weet!


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
vbmot schreef op donderdag 02 december 2010 @ 14:39:
Heb je in C# misschien een DOTALL mode net als in Java? DOTALL specificeert dat '.' ook newline characters matcht.
Nee naar mijn weten niet...

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Nu online

Haan

dotnetter

Maar ik zie bij de RegexOptions documentatie wel een 'SingleLine' optie die dat doet:
Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n).

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Haan schreef op donderdag 02 december 2010 @ 14:59:
[...]

Maar ik zie bij de RegexOptions documentatie wel een 'SingleLine' optie die dat doet:

[...]
Mmmm dat wist ik niet, ik had een ander idee van Singleline, namelijk dat een match altijd op 1 regel plaats moest vinden, ik krijg nu wel 2 "hits", dat helpt me iets verder omdat ik er 4 zou verwachten.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Waarom doe je dit met regexps? Het lijkt me dat dit met een xml parser veel makkelijker is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Janoz schreef op donderdag 02 december 2010 @ 15:21:
Waarom doe je dit met regexps? Het lijkt me dat dit met een xml parser veel makkelijker is.
Ja, was ook mijn eerst idee, maar dat kreeg ik niet helemaal voor elkaar, in mijn xpath geeft:

$currentPage/Article/a mijn geen hits

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Overigens lijkt ie nu aardig te werken, behalve dat ie te greedy is, ik krijg nu hits op:

code:
1
2
3
4
5
6
7
8
<a id="Plopperde plop"
name="Plopperde plop"></a>s felis quis pellentesque. Vestibulum
ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae; Praesent metus augue, consectetur vitae adipiscing
vel, ultricies eu arcu. Morbi viverra tempus turpis in porta.
Aliquam in vehicula urna. Nunc sagittis dignissim arcu, sed
faucibus velit ullamcorper sed. Nullam commodo lacinia dictum. <a
id="Hoi een Anchor" name="Hoi een Anchor"></a>

en
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<a id="Dit is een tekst"
name="Dit is een tekst"></a>nascetur ridiculus mus.</p>

<blockquote>
<p>Nulla id erat id nisi pretium facilisis. Maecenas orci velit,
posuere nec porta vitae, tincidunt ac lorem. Etiam vitae ipsum
lacus, eget iaculis diam. Nulla pellentesque, nunc ac viverra
lacinia, augue elit tempor dui, id aliquam arcu elit at enim. Cras
ac dapibus dolor. In hac habitasse platea dictumst. Donec
condimentum interdum fringilla. Sed vehicula dapibus est, in auctor
urna bibendum in. Sed et est nibh. Quisque neque turpis, ornare ut
elementum sit amet, adipiscing at nisi. Nunc hendrerit porttitor
quam ornare tempus. Fusce mollis pellentesque nibh ac pharetra.
Aenean lacinia nunc massa. Aliquam vitae odio eget nibh semper
mattis quis ac eros. Sed non vestibulum odio. Donec aliquet tellus
et nulla pulvinar pretium. Nullam id neque vel diam convallis
adipiscing nec quis purus. Nulla facilisi. Phasellus tempor lectus
id lectus luctus vitae suscipit ipsum eleifend.</p>
</blockquote>

<p>Donec luctus libero sed nibh convallis ut commodo magna dictum.
Proin rutrum mi in orci aliquet posuere. Mauris sed risus velit, in
elementum enim. In hac habitasse platea dictumst. Integer feugiat
bibendum pulvinar. Pellentesque ipsum massa, lacinia sed vulputate
quis, dictum sit amet risus. Nam molestie diam et lectus laoreet
eget eleifend nibh pellentesque. Ut ut lorem eget nibh <a
id="Hop paardjehop" name="Hop paardjehop"></a>

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
raptorix schreef op donderdag 02 december 2010 @ 15:26:
$currentPage/Article/a mijn geen hits
Dan moet je je eens verdiepen in XPath ;) Je doet nu een query op directe childnodes van Article waarin je dus anchors zoekt. Maar je anchors zitten niet direct onder Article maar in paragraphs etc.
raptorix schreef op donderdag 02 december 2010 @ 15:27:
Overigens lijkt ie nu aardig te werken, behalve dat ie te greedy is, ik krijg nu hits op:
En moet je je, met ruim 10.000 posts, dan ook nog eens wijzen op "Gebruik de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen is niet nodig." ?

[ Voor 42% gewijzigd door RobIII op 02-12-2010 15:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
RobIII schreef op donderdag 02 december 2010 @ 15:31:
[...]

Dan moet je je eens verdiepen in XPath ;) Je doet nu een query op directe childnodes van Article waarin je dus anchors zoekt. Maar je anchors zitten niet direct onder Article maar in paragraphs etc.
8)7 8)7 8)7 8)7 8)7
Stom dat ik hier niet aangedacht heb zeg, doe zo een beetje dagelijks xpath al vele jaren lang, tunnelvisie |:( |:( |:(

Acties:
  • 0 Henk 'm!

Verwijderd

niet gemakkelijker om te splitten op <a id=" en daarna de overige info eruit slaan?
niet de meest nette manier...maar wel lekker makkelijk >:)

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Mjah tuurlijk kan dat, maar dat vind ik wel erg lelijk :(

Acties:
  • 0 Henk 'm!

  • Gratzip
  • Registratie: Oktober 2010
  • Laatst online: 26-09-2020
Er staat " in je expression.
@"<a id=\"".*?"\" name=\"".*?"\"></a>",
^ werkt dit?

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Gratzip schreef op donderdag 02 december 2010 @ 16:10:
Er staat " in je expression.
@"<a id=\"".*?"\" name=\"".*?"\"></a>",
^ werkt dit?
Nee, het geeft zelfs syntax errors.

Acties:
  • 0 Henk 'm!

  • Gratzip
  • Registratie: Oktober 2010
  • Laatst online: 26-09-2020
Zie je vorige topic.
\[c#] Regexp probleempje
Staat geen wildcard tussen je <a>'s.

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Gratzip schreef op donderdag 02 december 2010 @ 16:23:
Zie je vorige topic.
\[c#] Regexp probleempje
Staat geen wildcard tussen je <a>'s.
Dat lijkt me stug, me Regexp lijkt gewoon goed te zijn:

Afbeeldingslocatie: http://i51.tinypic.com/2aa0z28.png

Acties:
  • 0 Henk 'm!

Verwijderd

Als je in plaats van de greedy .* modifier gewoon alles behalve de " pakt dan selecteert hij nooit te veel:
code:
1
<a id="[^"]*" name="[^"]*"></a>

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Pfff dat lijkt idd een goede Regexp te zijn, maar in me code krijg ik wederom geen hits :(

Acties:
  • 0 Henk 'm!

  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17-09 16:37
probeer deze
code:
1
<a\s*id="[^"]*"\s*name="[^"]*">\s*</a>
eens?
En ook de verschillende combinaties van de RegExOptions willen nog wel eens helpen

Het grote voordeel van windows is dat je meer dos-boxen kan openen


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

HTML, dat verwerk je niet met regexen. HTML parse je! Voor .NET kan je naar HTML Agility Pack kijken.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Sebazzz schreef op donderdag 02 december 2010 @ 22:00:
HTML, dat verwerk je niet met regexen. HTML parse je! Voor .NET kan je naar HTML Agility Pack kijken.
Inderdaad. Zelf gebruik ik het HTML Agility Pack ook wel eens wanneer ik met de hand CMS content moet crawlen. Steekt over het algemeen goed in elkaar en is wat vergevingsgezinder dan een XML parser, maar toch nog redelijk snel. (Heeft geloof ik alleen nog wat issues met HTML entity encoding, dus daar moet je wel mee opletten.)

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Dank voor het meedenken, ik denk dat ik idd het Agility pack eens ga gebruiken, het vreemde blijft dat de RegEx gewoon goed is, maar dat ik het in .NET niet werkend krijg, helaas heb ik hier al veel veel te veel tijd ingestoken, en frustrerend dat ik het net niet werkend krijg :(
Als ik van de week tijd heb zal ik eens kijken of ik het als kleine command line tool kan posten, want dit zal 1 van de eerste keren in 10 jaar tijd op GOT zijn dat ik met een echt onbevredigend gevoel achter blijf :(
Pagina: 1