Na przykład:
function(input){
var testVar = input;
string = ...
string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
Ale to oczywiście nie działa :) Czy jest na to sposób?
Na przykład:
function(input){
var testVar = input;
string = ...
string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
Ale to oczywiście nie działa :) Czy jest na to sposób?
Odpowiedzi:
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");
W przypadku niektórych komentarzy należy zauważyć, że możesz chcieć uciec od zmiennej, jeśli istnieje możliwość wystąpienia złośliwej zawartości (np. Zmienna pochodzi z danych wprowadzonych przez użytkownika)
W 2019 r. Byłoby to zwykle napisane przy użyciu ciągu szablonu, a powyższy kod został zaktualizowany. Oryginalna odpowiedź brzmiała:
var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");
regex
wyrażeniu
/\w+\//i
stajenew RegExp("\\w+/", "i")
Możesz użyć obiektu RegExp:
var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);
Następnie możesz budować regexstring
w dowolny sposób.
Możesz przeczytać więcej na ten temat tutaj .
Aby zbudować wyrażenie regularne ze zmiennej w JavaScript, musisz użyć RegExp
konstruktora z parametrem string.
function reg(input) {
var flags;
//could be any combination of 'g', 'i', and 'm'
flags = 'g';
return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
oczywiście jest to bardzo naiwny przykład. Zakłada się, że input
poprawnie zapisano go dla wyrażenia regularnego. Jeśli masz do czynienia z wprowadzaniem danych przez użytkownika lub po prostu chcesz wygodniej dopasowywać znaki specjalne, musisz uciec od znaków specjalnych :
function regexEscape(str) {
return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}
function reg(input) {
var flags;
//could be any combination of 'g', 'i', and 'm'
flags = 'g';
input = regexEscape(input);
return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
ReGeX
tekstu. Użyłem więc:return new RegExp(input, flags);
jeśli używasz literałów szablonu es6 są opcją ...
string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
^[^\s]{${4},${32}}$
); export const validatePassword = wartość => wartość.match (newRegExp); ``
Zawsze możesz podać wyrażenie regularne jako ciąg znaków, tj "ReGeX" + testVar + "ReGeX"
. Być może będziesz musiał uciec przed niektórymi znakami w ciągu (np. Podwójny cudzysłów), ale w większości przypadków jest to równoważne.
Możesz także użyć RegExp
konstruktora, aby przekazać flagi ( zobacz dokumentację ).
Możesz utworzyć wyrażenia regularne w JS na jeden z dwóch sposobów:
/ab{2}/g
new RegExp("ab{2}", "g")
.Literały wyrażeń regularnych są stałe i nie można ich używać ze zmiennymi. Można to osiągnąć za pomocą konstruktora. Struktura konstruktora RegEx jest
new RegExp(regularExpressionString, modifiersString)
Zmienne można osadzać jako część regularExpressionString. Na przykład,
var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g")
Będzie pasować do każdego wyglądu wzoru cdcdcd
.
Oto całkiem bezużyteczna funkcja, która zwraca wartości zawinięte przez określone znaki. :)
jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/
function getValsWrappedIn(str,c1,c2){
var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g");
return str.match(rg);
}
var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results = getValsWrappedIn(exampleStr,"(",")")
// Will return array ["5","19","thingy"]
console.log(results)
zaakceptowana odpowiedź nie działa dla mnie i nie jest zgodna z przykładami MDN
patrz sekcja „Opis” w powyższym linku
Wybrałbym następujące, które działają dla mnie:
let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)
// that makes dynamicRegExp = /findMe/gi
Trzeba tylko najpierw przygotować zmienną łańcuchową, a następnie przekonwertować ją na RegEx.
na przykład:
Chcesz dodać minLength
i MaxLength
za pomocą zmiennej do RegEx:
function getRegEx() {
const minLength = "5"; // for exapmle: min is 5
const maxLength = "12"; // for exapmle: man is 12
var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
regEx = new RegExp(regEx, "g"); // now we convert it to RegEx
return regEx; // In the end, we return the RegEx
}
teraz, jeśli zmienisz wartość MaxLength
lub MinLength
, to zmieni się we wszystkich RegExs.
Mam nadzieję, że się przydadzę. Przepraszam również za mój angielski.