Regex JS, matcha siffror som inte är del av ord.

Permalänk

Regex JS, matcha siffror som inte är del av ord.

Jag är helt VÄRDELÖS på Regular Expression. Har aldrig lärt mig och aldrig förstått fullt ut. Därför skulle jag uppskatta om någon kan ge mig lite klarhet.

Jag försöker lägga till egna "expressions" till SyntaxHighlighter.
Det jag försöker lägga till är ensamstående siffror.
Jag har provat att kopiera ett par från internet och även skapat mina egna med varierande lycka. T.ex. "[^a-z][0-9]" och "(?!a-z)[0-9]". Jag vet att detta bara täcker små bokstäver, men det var bara för att testa och sedan fortsätta bygga vidare om det fungerade.

Den ska matcha alla lösa siffror, t.ex.:
5
295891739
foo(1,2, 3)
foo[4,5, 6]

Därmot får den inte matcha siffror i funktioner eller variabler t.ex:
foo2("foo")
foo4
2foo = false
foo2foo = true

Den ska även matcha både heltal och decimaltal.

Jag tror inte det är ett problem med strings eller kommentarer då dessa expressions verkar gå före siffrorna och därför "skriver över" stilen.

Jag trodde detta skulle vara ganska enkelt, men antingen får jag med en bokstav innan siffrorna som jag inte vill ha eller så får jag hela ord. Är det superkomplicerat? Har någon lust att i alla fall peka mig åt rätt håll? Jag har bläddrat igenom ett par tutorials utan resultat.

När jag ändå skapat tråden kan jag passa på att fråga hur man exkluderar tecken ur resultatet som man vill söka efter. T.ex. vill jag matcha funktionen colors.combine(temp, color) men inte colors.red som är en konstant. Om jag använder "\w+\.\w+\(" får jag bara funktionen och inte konstanten, men jag får med "(" i resultatet.

Permalänk
Inaktiv

Ta en titt på http://regex101.com/ . Den sidan har hjälpt mig sjukt mycket när det gäller regular expressions! Du ser i realtime hur din expression ser ut och parseas, dina capturing groups osv. Samt har du en skitbra lathund där också. Den sidan lärde mig att bemästra regexps på ett dygn, när jag redan jävlats med det under flera års tid!

Permalänk
Medlem

Har inget svar just nu på din första fråga men din andra fråga så får du använda dig av Positive lookahead: (?=ABC) (matchar ABC men inkluderar inte i resultatet)

Citat:

Positive lookahead. Matches a group after your main expression without including it in the result.

Finns även Negative lookahead, Positive lookbehind och Negative lookbehind.

Edit: testa detta: http://regex101.com/r/lQ7cD4

Visa signatur

Mina poster är en illusion. Det som står skrivet här över står i själva verket inte där så inget av det som du läser är sant. Inte ens den här texten. Jag har själv ingen kunskap om det jag skriver och ingen bör således läsa eller ta in den information som står skrivet.

Permalänk
Datavetare

Rent generellt är det näst intill hopplöst att korrekt "parsa" språk som Java, C, C++ etc med hjälp av reguljära-uttryck. Men de exempel du listar borde fungera med detta förutsatt att "\b" anser att tecken som '(' och '[' inte är del av ord.

\D*\b(\d*)\b

För att visa hur man kan använda detta använder jag Pythons 're' modul som exempel

re.match(r"\D*\b(\d*)\b", "foo(1,2, 3)").group(1) -> '1' re.match(r"\D*\b(\d*)\b", "foo2").group(1) -> nil

Just att skapa en grupp är vad som löser ditt andra problem, kör du med detta yttryck

(\w+\.\w+)\(

re.match("r(\w+\.\w+)\(", "colors.combine(temp, color)").group(1) -> "colors.combine" re.match("r(\w+\.\w+)\(", "colors.red").group(1) -> nil

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

(?:\b(\d+(?:\.\d+)?)|[^.](\.\d+))\b

matchar

124
.124
1.24
(1, 2, 4)
[1, 2, 4]

matchar inte

foo2("foo")
foo4
2foo = false
foo2foo = true

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av anon214934:

Ta en titt på http://regex101.com/ . Den sidan har hjälpt mig sjukt mycket när det gäller regular expressions! Du ser i realtime hur din expression ser ut och parseas, dina capturing groups osv. Samt har du en skitbra lathund där också. Den sidan lärde mig att bemästra regexps på ett dygn, när jag redan jävlats med det under flera års tid!

Jag ska absolut kolla sidan och äntligen lära mig denna djungel. Tack.

Skrivet av rumpnisse:

Har inget svar just nu på din första fråga men din andra fråga så får du använda dig av Positive lookahead: (?=ABC) (matchar ABC men inkluderar inte i resultatet)

Finns även Negative lookahead, Positive lookbehind och Negative lookbehind.

Edit: testa detta: http://regex101.com/r/lQ7cD4

Jag använde mig utan positive lookahead "\w+\.\w+(?=\()", och det fungerade jättebra. Tack så mycket.

[QUOTE=Yoshman;13286811]Rent generellt är det näst intill hopplöst att korrekt "parsa" språk som Java, C, C++ etc med hjälp av reguljära-uttryck. Men de exempel du listar borde fungera med detta förutsatt att "\b" anser att tecken som '(' och '[' inte är del av ord.

\D*\b(\d*)\b

För att visa hur man kan använda detta använder jag Pythons 're' modul som exempel

re.match(r"\D*\b(\d*)\b", "foo(1,2, 3)").group(1) -> '1' re.match(r"\D*\b(\d*)\b", "foo2").group(1) -> nil

Just att skapa en grupp är vad som löser ditt andra problem, kör du med detta yttryck

(\w+\.\w+)\(

re.match("r(\w+\.\w+)\(", "colors.combine(temp, color)").group(1) -> "colors.combine" re.match("r(\w+\.\w+)\(", "colors.red").group(1) -> nil

[/QUOTE]
Den första loopar, den andra får jag fortfarande med "(" på slutet. Men nu fungerar allt bra. Jag uppskattar din hjälp. Tack.

Skrivet av Teknocide:

(?:\b(\d+(?:\.\d+)?)|[^.](\.\d+))\b

matchar

124
.124
1.24
(1, 2, 4)
[1, 2, 4]

matchar inte

foo2("foo")
foo4
2foo = false
foo2foo = true

Fungerar perfekt. Nu har jag bara kvar att lära mig så jag förstår vad du skrivit. Men jag märker att jag var en ganska bra bit ifrån med "[^a-z][0-9]". Tack så mycket för hjälpen.