Próbowałem utworzyć potok w maszynie do pisania, który podzieliłby łańcuch PascalCase, ale byłoby miło, gdyby to również podzieliło się na cyfry. Chciałbym również, aby dzieliła się na kolejne duże litery. Mam ten potok, który działa świetnie, z tym że działa tylko w Chrome, a nie w Firefoxie, najwyraźniej tylko Chrome obsługuje przeglądanie wstecz. Jak można to osiągnąć bez odwrotu?
transform(value: string): string {
let extracted = '';
if (!value) {
return extracted;
}
const regExSplit = value
.split(new RegExp('(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[0-9])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9])'));
for (let i = 0; i < regExSplit.length; i++) {
if (i !== regExSplit.length - 1) {
extracted += `${regExSplit[i]} `;
} else {
extracted += regExSplit[i];
}
}
return extracted;
}
Na przykład ciąg ANet15Amount
powinien zostać przekształcony w A Net 15 Amount
. Powyższe wyrażenie regularne również podzieli ciąg camelCase, ale nie jest to konieczne do rozważenia.
javascript
regex
typescript
develmatik
źródło
źródło
.replace(/([A-Z]|\d+)/g, " $1").trim();
(?!^)([A-Z]|\d+)
unika pierwszego miejsca i nie wymaga przycinania.Odpowiedzi:
Co powiesz na dopasowanie bardziej prostym wzorem takim jak ten i połączenie ze spacją.
Najpierw myślałem po prostu
[A-Z][a-z]*|\d+
, ale to złamie npABCDefg123
wA B C Defg 123
której byłaby inna roboczego do bieżącej funkcji, które zmieniają sięABC Defg 123
.Nadal jest mała różnica. Twoja przemienia
A1B2
się wA 1B 2
tę iA 1 B 2
tam, gdzie myślę, że ta będzie bardziej dokładna, prawda?źródło
Po prostu zamień dowolną wielką literę
[A-Z]
lub sekwencję cyfr\d+
spacją plus to, co właśnie dopasowaliśmy" $1"
. Pomijamy pierwszą literę, aby żadne spacje nie były dodawane na początku wynikowego ciągu, dodając ujemny wynik na początku łańcucha(?!^)
:Przykład:
Pokaż fragment kodu
źródło
Próbować
[A-Z]?[a-z]+|[A-Z]|[0-9]+
Test w generatorze: https://regex101.com/r/uBO0P5/1
źródło
Myślę, że to zależy od konwencji ciągu, co może zwiększyć złożoność
źródło