2 Pytanie: usuń początek łańcucha, aż znajdzie się znak

pytanie utworzone w Sat, Mar 16, 2019 12:00 AM

Mam ten ciąg:

const string ="{* * test * { * username: {{username}} * } }";

I chcę mieć w końcu coś takiego:

 "{\n\t\"username\": \"{{username}}\" \n}"

Próbuję usunąć pierwszą część łańcucha, aż zostanie znaleziony znak "{". Pierwszy należy oczywiście zignorować.

Oto kod, który próbuję:

const deleteFirstLastCharacter = string.substr(1).slice(0, -1);
const deleteFirstPart = deleteFirstLastCharacter.split("* * test *").pop();
const replace = deleteFirstPart.replace(/\*/g, "\n\t");

Wyjście, które otrzymuję:

 { 
         username: {{username}} 
         }

Wyjście, którego chcę: Aby zobaczyć to tak:

{
        "username": "{{username}}" 
}
    
0
  1. Czy regex jest dozwolony?
    2019-03-16 19: 16: 48Z
  2. Próbowałem to zrobić za pomocą wyrażenia regularnego, ale nie mogłem
    2019-03-16 19: 17: 49Z
  3. Doda odpowiedź regex
    2019-03-16 19: 24: 27Z
2 odpowiedzi                              2                         

Możesz użyć Regex, jeśli składnia się nie zmieni:

.* \{ \* ([^:]+): ([^ ]+) \* } }

Pierwszy .* ma pasować do {* * test *.
Reszta polega na przechwyceniu nazwy pola (nazwy użytkownika), a następnie jego wartości, podążając za gwiazdą i zamykając nawiasy klamrowe.

Kiedy jest mecz, możesz go zastąpić:

{\n\t"$1": "$2"\n}

Który daje następujące dane wyjściowe:

{
    "username": "{{username}}"
}

Oto fragment kodu:

const string = "{* * test * { * username: {{username}} * } }";
let output = string.replace(/.* \{ \* ([^:]+): ([^ ]+) \* } }/, '{\n\t"$1": "$2"\n}')
console.log(output)

Wypróbuj to wyrażenie tutaj: https://regex101.com/r/FbJzRE/1

    
4
2019-03-16 19: 52: 45Z
  1. właściwie to działało, ale tutaj jest tak, jakbyśmy zmuszali nasz ciąg do bycia tylko dwoma elementami. Ponieważ ciąg może się zmienić i mieć inne elementy.
    2019-03-16 19: 57: 12Z
  2. Będzie to bardzo przydatne dla OP i przyszłych czytelników, jeśli utworzysz fragment kodu. Mogą modyfikować wyrażenia regularne i testować rzeczy samodzielnie. Jeśli nie wiesz, jak je utworzyć: Jak mogę utworzyć fragment kodu stosu?
    2019-03-16 19: 57: 20Z
  3. Dlatego powiedziałem, że jeśli składnia nie zmienia się zbyt wiele, w przeciwnym razie zaktualizuj swoje pytanie i może uda mi się ulepszyć wyrażenie regularne. @adiga Dziękuję za fragment, nie wiedziałem jak go utworzyć!
    2019-03-16 20: 06: 10Z
  4. @ Haytam Właśnie zaktualizowałem moje pytanie oryginalnym pytaniem ... w części zastępczej nie może to być n groupe?
    2019-03-16 20: 22: 57Z
  5. Obawiam się, że potrzebujesz do tego jakiegoś parsera, ponieważ istnieją zagnieżdżone „pola”. Czy ta składnia ma nazwę? Może znajdziesz dla niego bibliotekę.
    2019-03-16 20: 39: 04Z

Pozwól, że dodam rozwiązanie bez wyrażenia regularnego. Twój problem polegał na tym, że potrzebujesz innej kolejności n i w dwóch przypadkach {i}, więc nie będzie działać z pojedynczym zastąpieniem podczas próby.

Spróbuj:

"{* * test * { * username: {{username}} * } }"
  .substr(1)
  .slice(0, -1)
  .split("* * test *")
  .pop()
  .replace(" { *","{\n\t")
  .replace("* } ", "\t\n}");
    
1
2019-04-22 12: 22: 46Z
źródło umieszczone tutaj