Regex dla \n działa inaczej

Regex dla \n działa inaczej
  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć!

Usiłuję otrzymać takie samo działanie jak poniżej, gdzie _ jest enterem:

Kopiuj
console.log(/^(.*)_(.+?)_$/g.exec("one_two_three_four_"));
Kopiuj
0: "one_two_three_four_"
1: "one_two_three"
2: "four"

Dla enterów regex nie może się dopasować:

Kopiuj
console.log(/^(.*)\n(.+?)\n$/g.exec("one\ntwo\nthree\nfour\n"));
Kopiuj
null

Kompletnie nie mam pojęcia co jest nie tak :(
Co jest nie tak?

ShookTea
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 629
1

Symbol ^ na początku oraz $ na końcu wskazują, że regex musi pasować do całego tekstu.
Drugi przykład, w przeciwieństwie do pierwszego, nie działa, ponieważ kropka może reprezentować dowolny znak z wyjątkiem nowej linii.
Dlatego regex przyjmie tylko te stringi, które składają się z jakiegoś ciągu znaków bez entera, następnie enter, następnie znowu ciąg znaków i kończy się enterem:
CIĄG ZNAKÓW - ENTER - CIĄG ZNAKÓW - ENTER
Z kolei dany przez ciebie ciąg znaków wygląda następująco:
CIĄG ZNAKÓW - ENTER - CIĄG ZNAKÓW - ENTER - CIĄG ZNAKÓW - ENTER - CIĄG ZNAKÓW - ENTER
A że jak napisałem na początku, regex musi pasować do całego tekstu przez użycie ^$, nic nie znajduje.

Pierwszy przykład zadziałał, ponieważ podkreślenie _ zostało uznane przez kropkę jako dowolny znak.

Możesz pobawić się tutaj:
https://regex101.com/
Zauważysz, że twój drugi przykład po usunięciu $ i/lub ^ zaczyna działać, i to na różne sposoby.

  • Rejestracja: dni
  • Ostatnio: dni
0

Ogarnięte:

Kopiuj
console.log(/^([\s\S]*)\n(.+?)\n$/g.exec("one\ntwo\nthree\nfour\n"));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.