• mkwt@lemmy.world
    link
    fedilink
    arrow-up
    31
    ·
    3 days ago

    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
      link
      fedilink
      arrow-up
      6
      ·
      3 days ago

      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. :-)

    • madcaesar@lemmy.world
      link
      fedilink
      arrow-up
      4
      ·
      3 days ago

      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
        link
        fedilink
        arrow-up
        4
        ·
        2 days ago

        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.

    • SatyrSack@lemmy.sdf.org
      link
      fedilink
      arrow-up
      13
      ·
      3 days ago

      How so? I have been getting much more comfortable with it lately, but I am curious what downsides there are

      • Midnitte@beehaw.org
        link
        fedilink
        English
        arrow-up
        18
        arrow-down
        1
        ·
        3 days ago

        The downsides are having to relearn it every time you need to understand it.

        • SatyrSack@lemmy.sdf.org
          link
          fedilink
          arrow-up
          23
          ·
          edit-2
          3 days ago

          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
          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 |