Projektuję tester wyrażeń regularnych w HTML i JavaScript. Użytkownik wprowadzi wyrażenie regularne, ciąg znaków i wybierze funkcję, którą chce przetestować (np. Wyszukaj, dopasuj, zamień itp.) Przyciskiem radiowym, a program wyświetli wyniki, gdy funkcja ta zostanie uruchomiona z podanymi argumentami. Oczywiście będą dodatkowe pola tekstowe do zastąpienia dodatkowych argumentów i tak dalej.
Moim problemem jest pobranie ciągu od użytkownika i przekształcenie go w wyrażenie regularne. Jeśli powiem, że nie muszą mieć //
przedrostka, do którego wchodzą, to nie mogą ustawiać flag, takich jak g
i i
. Muszą więc mieć //
wokół wyrażenia, ale jak mogę przekonwertować ten ciąg na wyrażenie regularne? Nie może być literałem, ponieważ jest łańcuchem i nie mogę przekazać go konstruktorowi RegExp, ponieważ nie jest łańcuchem bez //
liter. Czy istnieje inny sposób przekształcenia ciągu wejściowego użytkownika w wyrażenie regularne? Czy będę musiał przeanalizować ciąg i flagi wyrażenia regularnego z literami //
„s”, a następnie skonstruować go w inny sposób? Czy powinienem je wprowadzić ciąg, a następnie osobno wprowadzić flagi?
źródło
var re = new RegExp("\\w+");
<input>
tag HTML.var re = new RegExp("\"\\w+\"");
jest przykładem regexu zakodowanego na stałe za pomocą konstruktora RegExp i konieczne jest unikanie podwójnych cudzysłowów . Rozumiem przez ciąg w zmiennej to, że możesz po prostu zrobićvar re = new RegExp(str);
istr
może on bez problemu zawierać podwójne cudzysłowy lub ukośniki odwrotne.lub
źródło
/\/
.Oto jedna linijka:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Mam go z modułu NPM „ escape-string-regexp” .
Wypróbowanie:
Używanie otagowanych literałów szablonów z obsługą flag:
źródło
Użyj konstruktora obiektów JavaScript RegExp .
Możesz przekazać flagi jako drugi argument ciągu do konstruktora. Szczegółowe informacje można znaleźć w dokumentacji.
źródło
W moim przypadku dane wprowadzane przez użytkownika były czasem otoczone ogranicznikami, a czasem nie. dlatego dodałem inny przypadek ..
źródło
.split()
funkcji zamiast długiego łańcucha wyrażeń regularnych.regParts = inputstring.split('/')
spowoduje to utworzenieregParts[1]
łańcucha wyrażeń regularnych iregParts[2]
ograniczników (przy założeniu, że ustawienie wyrażenia regularnego jest/.../gim
). Możesz sprawdzić, czy istnieją separatory zregParts[2].length < 0
.Sugeruję również dodanie osobnych pól wyboru lub pola tekstowego dla specjalnych flag. W ten sposób jasne jest, że użytkownik nie musi dodawać żadnych
//
. W przypadku zamiany podaj dwa pola tekstowe. Ułatwi ci to życie.Dlaczego? Ponieważ w przeciwnym razie niektórzy użytkownicy dodadzą
//
, a inni nie. A niektóre popełniają błąd składniowy. Następnie, po usunięciu//
's, możesz skończyć z poprawnym składniowo wyrażeniem regularnym, który nie jest podobny do zamierzonego przez użytkownika, co prowadzi do dziwnych zachowań (z perspektywy użytkownika).źródło
Działa to również wtedy, gdy ciąg jest nieprawidłowy lub nie zawiera flag itp .:
źródło
Jeśli naprawdę chcesz przekonwertować ciąg na wyrażenie regularne, spróbuj użyć następującej funkcji:
Możesz go używać w następujący sposób:
Dla odniesienia, oto sformatowana i bardziej nowoczesna wersja:
źródło
Dzięki wcześniejszym odpowiedziom bloki te służą również jako rozwiązanie ogólnego zastosowania do stosowania ciągów konfigurowalnych w RegEx .. do filtrowania tekstu:
źródło
Możesz poprosić o flagi za pomocą pól wyboru, a następnie zrobić coś takiego:
źródło
Używam
eval
aby rozwiązać ten problem.Na przykład:
źródło