Czy można coś takiego zrobić?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Czy muszę użyć nowej RegExp()
składni i połączyć ciąg? Wolałbym użyć dosłownego, ponieważ kod jest zarówno bardziej oczywisty, jak i zwięzły.
javascript
regex
syntax
bez powiek
źródło
źródło
let regexSegment1 = String.raw`\s*hello\s*`
Odpowiedzi:
Oto jak utworzyć wyrażenie regularne bez używania składni literału wyrażenia regularnego. Pozwala to na dowolną manipulację ciągiem znaków, zanim stanie się on obiektem wyrażenia regularnego:
Jeśli masz dwa literały wyrażeń regularnych, możesz je połączyć za pomocą tej techniki:
Jest to po prostu bardziej rozwlekłe niż posiadanie wyrażenia pierwszego i drugiego jako ciągów znaków zamiast dosłownych wyrażeń regularnych.
źródło
new RegExp(/(/.source + /.*/.source + /)?/.source);
nie wydaje się działać.expression_one
? Czy masz na myśliregex1
?Samo losowe łączenie obiektów wyrażeń regularnych może mieć pewne niepożądane skutki uboczne. Zamiast tego użyj RegExp.source :
Zapewni to również możliwość zachowania flag wyrażeń regularnych z poprzedniego RegExp przy użyciu standardowych flag RegExp.
jsFiddle
źródło
RegExp.prototype.flags
Nie całkiem zgadzam się z opcją „eval”.
zwróci „// abcd // efgh //”, co nie jest zamierzonym wynikiem.
Korzystanie ze źródeł takich jak
da "/ abcdefgh /" i to jest poprawne.
Logicznie, nie ma potrzeby OCENIANIA, znasz swoje WYRAŻENIE. Potrzebujesz tylko jego ŹRÓDŁA lub tego, jak jest napisane, niekoniecznie jego wartości. Jeśli chodzi o flagi, wystarczy użyć opcjonalnego argumentu RegExp.
W mojej sytuacji poruszam się w kwestii ^ i $ używanych w kilku wyrażeniach, które próbuję połączyć! Wyrażenia te są filtrami gramatycznymi używanymi w programie. Teraz nie chciałbym używać niektórych z nich razem do obsługi PREPOZYCJI. Być może będę musiał „pokroić” źródła, aby usunąć początek i koniec ^ (i / lub) $ :) Pozdrawiam, Alex.
źródło
var regex = "\.\..*"
Problem Jeśli wyrażenie regularne zawiera grupy z dopasowaniem wstecznym, takie jak \ 1.
Wtedy zwykłe kontatowanie źródeł nie zadziała. Rzeczywiście, połączenie tych dwóch to:
Rozwiązanie: najpierw liczymy liczbę pasujących grup w pierwszym wyrażeniu regularnym, a następnie dla każdego tokena dopasowania wstecznego w drugim zwiększamy go o liczbę pasujących grup.
Test:
źródło
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Byłoby lepiej, aby jak najczęściej używać składni literału. Jest krótszy, bardziej czytelny i nie potrzebujesz cudzysłowów ucieczki ani podwójnych znaków zwrotnych. Z „Wzorce JavaScript”, Stoyan Stefanov 2010.
Ale użycie New może być jedynym sposobem na konkatenację.
Unikałbym eval. To nie jest bezpieczne.
źródło
Pod warunkiem, że:
/this/g
zamiastnew RegExp('this', 'g')
;W takim razie możesz napisać w ten sposób:
możesz wtedy zrobić coś takiego:
W moim konkretnym przypadku (edytor podobny do kodu lustrzanego) znacznie łatwiej jest wykonać jedno duże wyrażenie regularne niż wiele zastępstw, takich jak śledzenie, ponieważ za każdym razem, gdy zastępuję tag html, aby zawinąć wyrażenie, następny wzorzec będzie trudniej jest kierować reklamy bez wpływu na sam tag HTML (i bez dobrego lookbehind, którego niestety nie obsługuje javascript):
źródło
Możesz zrobić coś takiego:
Segmenty byłyby łańcuchami (a nie literałami wyrażenia regularnego) przekazanymi jako oddzielne argumenty.
źródło
Nie, dosłowny sposób nie jest obsługiwany. Będziesz musiał użyć RegExp.
źródło
Użyj konstruktora z 2 parametrami i uniknij problemu z końcowym znakiem „/”:
źródło
Możesz konkatować źródło wyrażenia regularnego zarówno z klasy literału, jak i klasy RegExp:
źródło
łatwiejszą drogą byłoby dla mnie konkatenację źródeł, np .:
wartość c spowoduje:
źródło
Wolę używać
eval('your expression')
, ponieważ nie dodać/
na każdym końcu/
, że='new RegExp'
nie.źródło