[RegExp] Woord met speciaal tekens vinden

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik loop vast op een ogenschijnlijk eenvoudige reguliere expressie. Ik probeer te vinden of een bepaald woord in een string voorkomt. Het 'woord' mag ook speciale tekens bevatten.

Ik zoek een reguliere expressie waarbij de volgende tests slagen:

matches '|s'expected result
dit |s een testtrue
dit|s een testfalse
|s een testtrue
dit |seen testfalse


Ik had verwacht dat de volgende expressie zou werken, maar helaas... :(
code:
1
\b(\|s)\b


Kan iemand mij uitleggen waar mijn denkfout zit 8)7

[ Voor 24% gewijzigd door Verwijderd op 24-06-2009 07:39 . Reden: Ruis uit bericht verwijderd, en typefoutjes aangepast nav bericht NMe ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 13:41

CoolGamer

What is it? Dragons?

Reguliere expressies staan alleen de tekens toe die exact hetzelfde zijn. Je kan "Case Insensitive" aanzetten om zowel een i als I te matchen, maar dat geldt alleen voor letters. Bijzondere tekens moet je apart toevoegen. Dus als je wilt dat |s ook matcht, zal je iets moeten doen als:
code:
1
\b\{[iI|s]s}\b

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Ik weet niet wat voor regexp library je gebruikt, er kunnen nog wel eens wat subtiele verschillen zijn per library. De regextester waar je naar linkt, gebruikt standaard iets van .net, daar heb ik geen ervaring mee, maar volgens mij werkt \b(|s)\b wel, blijkbaar hoef je daarbij binnen een groep (bepaalde) speciale symbolen niet te escapen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TheCoolGamer schreef op dinsdag 23 juni 2009 @ 21:56:
Reguliere expressies staan alleen de tekens toe die exact hetzelfde zijn. Je kan "Case Insensitive" aanzetten om zowel een i als I te matchen, maar dat geldt alleen voor letters. Bijzondere tekens moet je apart toevoegen. Dus als je wilt dat |s ook matcht, zal je iets moeten doen als:
code:
1
\b\{[iI|s]s}\b
Sorry, ik lees mijn posting nu en ik zie dat ik niet volledig was;

Er hoeft niet zowel of 'is' als '|s' gematched te worden. Ik ben op zoek naar een regexp waarbij de cases uit de laatste tabel werken. Ik gebruik overigens de .Net library.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:46

TeeDee

CQB 241

Afaik is
code:
1
\b(\\|s)\b
voldoende. Een dubbele escape voor je pipe ;) Misschien zou je voor het 'pipe' symbool ook de unicode variant kunnen gebruiken. ( \\u007c )

Hoe je de andere matches / results op kan snorren: dit is nog altijd /14 i.e. zelf aan de slag :)
NMe schreef op woensdag 24 juni 2009 @ 00:24:
edit:
TeeDee: die dubbele escape hoeft toch alleen als je via een andere taal die ook slashes als escapeteken gebruikt zo'n regexp opbouwt? :)
Hmm, daar zou je best wel eens een punt kunnen hebben ;)

[ Voor 96% gewijzigd door TeeDee op 24-06-2009 08:36 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je gebruikt in je tweede tabel op de eerste drie regels een I (hoofdletter i) maar in de header en de vierde regel een | (pipe-teken). Waar wil je nou op matchen? Als het moet matchen op een hoofdletter i dan is het niet meer dan case insensitivity aanzetten. Moet het ook matchen op een pipe-teken dan is het nog steeds niet moeilijk en kun je een variatie maken op wat TeeDee hierboven zegt.

Wat is nou precies het probleem? Je topicstart is in elk geval niet duidelijk genoeg. ;)

edit:
TeeDee: die dubbele escape hoeft toch alleen als je via een andere taal die ook slashes als escapeteken gebruikt zo'n regexp opbouwt? :)

[ Voor 13% gewijzigd door NMe op 24-06-2009 00:26 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik denk dat de denkfout erin zit dat \b daadwerkelijk een karakter opsoepeerd. Dit is niet waar, die pipe zorgt er altijd voor dat je \b zal matchen, omdat daar een woordscheiding zit, wat nul karakters is. Je kan iets gebruiken als:
code:
1
(?<=^|\W)(\|s)\b

Dus een niet-woordkarakter of het begin, zonder dat zelf te matchen, gevolgd door |s. Let er op dat iets als
"dit ||s een test" dan wel zal matchen, omdat pipe geen woord-karakter is.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Gebruik je een matcher die matched als je regexp een deel van je string matched, of heb je nog een ".*?" aan beide kanten van de expressie nodig omdat je de hele string probeert te matchen?

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry, ik leg het denk ik niet helemaal duidelijk uit ;(

Functioneel is de wens te controleren of een tekst 'verboden woorden' bevat; denk hierbij aan scheldwoorden. Het hele, los staande woord moet matchen.

Dus als we controleren of een tekst het woord 'test' bevat, moet het resultaat true zijn in de volgende teksten:
  • 'test aan het begin van een string'
  • 'een test in het midden van een string'
  • 'aan het eind van een string het woord test'
In onderstaande teksten moet het resultaat false (= bevat het gezochte woord niet) zijn:
  • 'testaan het begin van een string'
  • 'eentestin het midden van een string'
  • 'aan het eind van een string het woordtest'
Ik zoek een expressie waarbij ik een 'verboden woord' dat speciale karakters (bv /$()|) bevat kan vinden.

Dus bijvoorbeeld het woord: te$t

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Scratch {

    public static void main(String[] args) {

        final String[] ss =
            new String[] { "te$t aan het begin van een string",
                "een te$t in het midden van een string",
                "aan het eind van een string het woord te$t",
                "te$taan het begin van een string",
                "eente$tin het midden van een string",
                "aan het eind van een string het woordte$t" };

        for (String s: ss) {
            System.out.println(s.matches(".*\\b(te\\$t)\\b.*"));
        }
    }
}

geeft het door jou gewenste resultaat. In Java moet je de \ zelf ook escapen in de string, waardoor die allemaal dubbel zijn. Daarnaast match je de hele string, dus moet er .* aan beide kanten, anders zijn ze allemaal false.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op woensdag 24 juni 2009 @ 11:07:
[snip]
Dus bijvoorbeeld het woord: te$t
Het scheelt nogal of het speciale teken op het begin of eind van het woord staat, of ergens anders zoals in dit voorbeeld... (zie mijn vorige post...) En wil je nu te$t$ wel of niet matchen?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op woensdag 24 juni 2009 @ 12:00:
[...]
Het scheelt nogal of het speciale teken op het begin of eind van het woord staat, of ergens anders zoals in dit voorbeeld... (zie mijn vorige post...)
Hmmm, inderdaad... de uitwerking van Confusion werkt inderdaad wanneer het woord een speciaal karakter midden in het woord bevat. Bedankt, de cases die ik noemde werken inderdaad.

Helaas werkt dit niet wanneer ik op zoek ben met een speciaal karakter aan het einde van het woord (bijv 'test$').
pedorus schreef op woensdag 24 juni 2009 @ 12:00:
[...]
En wil je nu te$t$ wel of niet matchen?
Ik zoek de vorm van een expressie die een exacte match van een willekeurig woord. Dus als ik zoek naar 'te$t$', dan moet alleen gematched worden wanneer 'te$t$' als losstaand woord voorkomt. Voor ieder woord, kan dus een aangepaste expressie gebruikt worden; als het maar mogelijk is mbv het woord de expressie te construeren.

[ Voor 9% gewijzigd door Verwijderd op 24-06-2009 13:05 ]


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

En wanneer beschouw je iets als een los woord? Als er aan beide kanten whitespace of een regelbegin of -einde naast staat? In dat geval zou je kunnen matchen op

(^|\s)+(te\$t\$)(\s|$)+

maar ik weet niet of jouw regex engine het opnemen van ^ en $ midden in regexes ondersteunt. Dit levert in Java (en Perl en Python) in ieder geval het gewenste resultaat op en je hebt niet het nadeel van de oplossing van pedorus, waarbij twee niet-word tekens een probleem vormen.

@NMe: Oops, ja, aangepast.

[ Voor 37% gewijzigd door Confusion op 24-06-2009 15:39 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik neem aan dat je in dit geval dan wel nog even te$t$ moet escapen. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1