Skip to content

Commit

Permalink
Add predefined character class \D (no digit)
Browse files Browse the repository at this point in the history
Matches every character except digits (`0` to `9`).

In PureBasic this means:

- `Chr(1)` to `Chr(47)`

- `Chr(58)` to `Chr(65535)`

Close #23
  • Loading branch information
SicroAtGit committed Dec 31, 2021
1 parent 10c5a2e commit 06bce32
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ When matching, the RegEx engine matches always the longest match among several p
| `\n` | Matches the line feed |
| `\t` | Matches the tab character |
| `\d` | Matches the digits from `0` to `9` |
| `\D` | Matches every character except digits (`0` to `9`) |
| `\s` | Matches any whitespace character (`\t`, `\r`, `\n`, `\f` and `space`) |
| `.` | Matches every character except line breaks (`\r` and `\n`) |

Expand Down
41 changes: 41 additions & 0 deletions RegExEngine.pbi
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,44 @@ Module RegEx
ProcedureReturn *base
EndProcedure

Procedure CreateNfaNoDigits(*regExEngine)
Protected *base, *nfa1, *nfa2
Protected i

; Chr(1) to Chr(47)
; Chr(58) to Chr(65535)

; nfa1 nfa2
; [1-47] [0]
; [58-255] [0]

*nfa1 = CreateNfaSymbol(*regExEngine, 1)
For i = 2 To 47
*nfa1 = CreateNfaUnion(*regExEngine, *nfa1, CreateNfaSymbol(*regExEngine, i))
Next
For i = 58 To 255
*nfa1 = CreateNfaUnion(*regExEngine, *nfa1, CreateNfaSymbol(*regExEngine, i))
Next
*nfa2 = CreateNfaSymbol(*regExEngine, 0)
*base = CreateNfaConcatenation(*regExEngine, *nfa1, *nfa2)

; nfa1 nfa2
; [0-255] [1-255]

*nfa1 = CreateNfaSymbol(*regExEngine, 0)
For i = 1 To 255
*nfa1 = CreateNfaUnion(*regExEngine, *nfa1, CreateNfaSymbol(*regExEngine, i))
Next
*nfa2 = CreateNfaSymbol(*regExEngine, 1)
For i = 2 To 255
*nfa2 = CreateNfaUnion(*regExEngine, *nfa2, CreateNfaSymbol(*regExEngine, i))
Next
*base = CreateNfaUnion(*regExEngine, *base,
CreateNfaConcatenation(*regExEngine, *nfa1, *nfa2))

ProcedureReturn *base
EndProcedure

Procedure CreateNfaWhiteSpace(*regExEngine)
Protected *base, *nfa1, *nfa2

Expand Down Expand Up @@ -383,6 +421,9 @@ Module RegEx
Case 'd'
*regExString\currentPosition + SizeOf(Unicode)
ProcedureReturn CreateNfaDigits(*regExEngine)
Case 'D'
*regExString\currentPosition + SizeOf(Unicode)
ProcedureReturn CreateNfaNoDigits(*regExEngine)
Case 's'
*regExString\currentPosition + SizeOf(Unicode)
ProcedureReturn CreateNfaWhiteSpace(*regExEngine)
Expand Down

0 comments on commit 06bce32

Please sign in to comment.