One time I did this thing with an internal calibration program where the user had to type floats into a text box. I set it up so that every key stroke was validated so that the string in the box had to parse as a valid number within the assigned range at all intermediate steps.
Add automatic normalization to the box (you know, you type "05" and it drops the leading zero, you type "0.70" and it drops the trailing zero, etc.) and it often gets completely impossible to write anything valid. Some banking apps do something similar. :-)
Here is my cheatsheet that has been very helpful. Obviously, this will not teach you how RegEx works, but is a good quick reference when I forget the exact syntax for something.
RegExp
Character classes
Pattern
Description
.
Any character, except newline
\w
Word
\d
Digit
\s
Whitespace
\W
Not word
\D
Not digit
\S
Not whitespace
[abc]
Any of a, b, or c
[a-e]
Characters between a and e
[1-9]
Digit between 1 and 9
[[:print:]]
Any printable character including spaces
[^abc]
Any character except a, b or c
Anchors
Pattern
Description
\G
Start of match
^
Start of string *
$
End of string *
\A
Start of string
\Z
End of string
\z
Absolute end of string
\b
A word boundary
\B
Non-word boundary
^abc
Start with abc
abc$
End with abc
For multiline patterns (m flag), ^ and $ will act as start and end of line.
Escaped characters
Pattern
Description
\. \* \\
Escape special character used by regex
\t
Tab
\n
Newline
\r
Carriage return
Groups
Pattern
Description
(abc)
Capture group
(a|b)
Match a or b
(?:abc)
Match abc, but don't capture
\1
Substituted with text matched of the 1st capturing group
Quantifiers
Pattern
Description
a*
Match 0 or more
a+
Match 1 or more
a?
Match 0 or 1
a{5}
Match exactly 5
a{,3}
Match up to 3
a{3,}
Match 3 or more
a{1,3}
Match between 1 and 3
Lookahead & Lookbehind
Pattern
Description
a(?=b)
Match a in baby but not in bay
a(?!b)
Match a in Stan but not in Stab
(?<=a)b
Match b in crabs but not in cribs
(?<!a)b
Match b in fib but not in fab
(?<![a-z])abc(?![a-z])
Match abc without any letters before/after
::: spoiler Raw Markdown
# RegExp
## Character classes
| Pattern | Description |
| ------------- | ---------------------------------------- |
| `.` | Any character, except newline |
| `\w` | Word |
| `\d` | Digit |
| `\s` | Whitespace |
| `\W` | Not word |
| `\D` | Not digit |
| `\S` | Not whitespace |
| `[abc]` | Any of a, b, or c |
| `[a-e]` | Characters between `a` and `e` |
| `[1-9]` | Digit between `1` and `9` |
| `[[:print:]]` | Any printable character including spaces |
| `[^abc]` | Any character except `a`, `b` or `c` |
## Anchors
| Pattern | Description |
| ------- | ---------------------- |
| `\G` | Start of match |
| `^` | Start of string \* |
| `$` | End of string \* |
| `\A` | Start of string |
| `\Z` | End of string |
| `\z` | Absolute end of string |
| `\b` | A word boundary |
| `\B` | Non-word boundary |
| `^abc` | Start with `abc` |
| `abc$` | End with `abc` |
For multiline patterns (`m` flag), `^` and `$` will act as start and end of line.
## Escaped characters
| Pattern | Description |
| ---------- | -------------------------------------- |
| `\. \* \\` | Escape special character used by regex |
| `\t` | Tab |
| `\n` | Newline |
| `\r` | Carriage return |
## Groups
| Pattern | Description |
| --------- | -------------------------------------------------------- |
| `(abc)` | Capture group |
| `(a\|b)` | Match `a` or `b` |
| `(?:abc)` | Match `abc`, but don't capture |
| `\1` | Substituted with text matched of the 1st capturing group |
## Quantifiers
| Pattern | Description |
| -------- | --------------------- |
| `a*` | Match 0 or more |
| `a+` | Match 1 or more |
| `a?` | Match 0 or 1 |
| `a{5}` | Match exactly 5 |
| `a{,3}` | Match up to 3 |
| `a{3,}` | Match 3 or more |
| `a{1,3}` | Match between 1 and 3 |
## Lookahead & Lookbehind
| Pattern | Description |
| --- | --- |
| `a(?=b)` | Match `a` in `baby` but not in `bay` |
| `a(?!b)` | Match `a` in `Stan` but not in `Stab` |
| `(?<=a)b` | Match `b` in `crabs` but not in `cribs` |
| `(?<!a)b` | Match `b` in `fib` but not in `fab` |
| `(?<![a-z])abc(?![a-z])` | Match `abc` without any letters before/after |
That's not the front-end job. You can do common sense stuff, but any real protection needs to be on the backend. Any front end validation is basically "plz don't hax"
Frontend validation is for real time user feedback (without hitting the backend constantly) instead of needing to submit the form before throwing an error/warning.
13 Comments
mkwt@lemmy.world · 32 pts · 1y
One time I did this thing with an internal calibration program where the user had to type floats into a text box. I set it up so that every key stroke was validated so that the string in the box had to parse as a valid number within the assigned range at all intermediate steps.
Everyone hated that.
mormegil@programming.dev · 7 pts · 1y
Add automatic normalization to the box (you know, you type "05" and it drops the leading zero, you type "0.70" and it drops the trailing zero, etc.) and it often gets completely impossible to write anything valid. Some banking apps do something similar. :-)
cupcakezealot@piefed.blahaj.zone · 19 pts · 1y
tbf regular expressions suck
SatyrSack@lemmy.sdf.org · 13 pts · 1y
How so? I have been getting much more comfortable with it lately, but I am curious what downsides there are
cupcakezealot@piefed.blahaj.zone · 11 pts · 1y
not really i just meant they suck to remember how to write without looking up :)
SatyrSack@lemmy.sdf.org · 23 pts · 1y
Here is my cheatsheet that has been very helpful. Obviously, this will not teach you how RegEx works, but is a good quick reference when I forget the exact syntax for something.
RegExp
Character classes
.\w\d\s\W\D\S[abc][a-e]aande[1-9]1and9[[:print:]][^abc]a,borcAnchors
\G^$\A\Z\z\b\B^abcabcabc$abcFor multiline patterns (
mflag),^and$will act as start and end of line.Escaped characters
\. \* \\\t\n\rGroups
(abc)(a|b)aorb(?:abc)abc, but don't capture\1Quantifiers
a*a+a?a{5}a{,3}a{3,}a{1,3}Lookahead & Lookbehind
a(?=b)ainbabybut not inbaya(?!b)ainStanbut not inStab(?<=a)bbincrabsbut not incribs(?<!a)bbinfibbut not infab(?<![a-z])abc(?![a-z])abcwithout any letters before/after::: spoiler Raw Markdown
:::
Aurenkin@sh.itjust.works · 8 pts · 1y
Plus most drop downs allow you to type anyway from memory.
yaroto98@lemmy.org · 19 pts · 1y
Jr developer told to sanitize inputs to keep db secure. Comes up with this.
madcaesar@lemmy.world · 6 pts · 1y
That's not the front-end job. You can do common sense stuff, but any real protection needs to be on the backend. Any front end validation is basically "plz don't hax"
Matty_r@programming.dev · 4 pts · 1y
Frontend validation is for real time user feedback (without hitting the backend constantly) instead of needing to submit the form before throwing an error/warning.
hexagonwin@lemmy.sdf.org · 9 pts · 1y
still better than showing some crappy virtual keypad
tgirlschierke@lemmy.blahaj.zone · 6 pts · 1y
yandev is that you
zqwzzle@lemmy.ca · 2 pts · 1y
https://imgur.com/a/S0ZVG1T