Mam kod HTML przed i po ciągu:
name="some_text_0_some_text"
Chciałbym zastąpić 0
coś w stylu:!NEW_ID!
Więc stworzyłem prosty regex:
.*name="\w+(\d+)\w+".*
Ale nie widzę, jak zastąpić wyłącznie przechwycony blok.
Czy istnieje sposób na zastąpienie przechwyconego wyniku, takiego jak (1 USD), jakimś innym ciągiem?
Wynik byłby:
name="some_text_!NEW_ID!_some_text"
javascript
regex
Nicolas Guillaume
źródło
źródło
$
, więc pierwsze słowo(\w+)
jest w grupie i staje się$1
, środkowa część(\d+)
jest drugą grupą (ale otrzymuje ignorowane w zastępowaniu), a trzecia grupa to$3
. Kiedy podasz ciąg zastępujący"$1!new_ID!$3"
, $ 1 i $ 3 zostaną automatycznie zamienione na pierwszą grupę i trzecią grupę, umożliwiając zastąpienie drugiej grupy nowym ciągiem, zachowując otaczający tekst.Teraz, gdy JavaScript ma wygląd (od ES2018 ), w nowszych środowiskach możesz całkowicie unikać grup w takich sytuacjach. Raczej lookbehind za to, co jest przed grupą ty przechwytywania i uprzedzona do przychodzi później i wymienić tylko
!NEW_ID!
:Dzięki tej metodzie pełne dopasowanie jest tylko częścią, którą należy wymienić.
(?<=name="\w+)
- Szukajname"
, a po nim znaków słownych (na szczęście, lookbehinds nie muszą mieć stałej szerokości w JavaScript!)\d+
- Dopasuj jedną lub więcej cyfr - jedyna część wzorca nie znajduje się w otoczeniu, jedyna część łańcucha, która będzie w wynikowym dopasowaniu(?=\w+")
- Poszukaj znaków słownych, po których następuje"
„Pamiętaj, że lookbehind jest całkiem nowy. Działa w nowoczesnych wersjach V8 (w tym Chrome, Opera i Node), ale nie w większości innych środowisk , przynajmniej jeszcze nie. Chociaż możesz niezawodnie korzystać z lookbehind w Node i we własnej przeglądarce (jeśli działa na nowoczesnej wersji V8), nie jest jeszcze wystarczająco obsługiwana przez losowych klientów (jak na publicznej stronie internetowej).
źródło
\d+
, prawda?match => match * 2
. Cyfry są cały czas zgodne, więc nie ma potrzeby grupNiewielką poprawą w odpowiedzi Matthew może być spojrzenie w przyszłość zamiast ostatniej grupy przechwytywania:
Możesz też podzielić dziesiętnie i dołączyć do nowego identyfikatora w ten sposób:
Przykład / Benchmark tutaj: https://codepen.io/jogai/full/oyNXBX
źródło
Przy dwóch grupach pojmania byłoby również możliwe; Dodałbym także dwa myślniki, jako dodatkowe lewą i prawą granicę, przed i po cyfrach, a zmodyfikowane wyrażenie wyglądałoby tak:
RegEx Circuit
jex.im wizualizuje wyrażenia regularne:
źródło
Prostszą opcją jest przechwycenie cyfr i zastąpienie ich.
Zasoby
źródło