Aktualizacja
Jeśli struny są tylko poprawnymi wzorami chemicznymi, po co zawracać sobie głowę za pomocą dolnego indeksu/cyfr/liter? Istnieją nie-białe znaki:. Ponieważ nie musi być obowiązkowa list lub (
, używać ich w klasy postaci [a-z(]
, a następnie dołączyć \S*
(zero lub więcej nie spacje):
/(?:\d+)?[a-z(]\S*/gi
Zobacz regex demo. (?:...)?
konstruktem jest opcjonalnie Grupa bez chwytania (czyli grupa, która służy tylko do grupy, nie wychwytywania (= przechowywania submatch wewnątrz bufora pamięci).
oryginalny odpowiedź z wyjaśnieniem przyczynę
masz cyfry i przestrzeni wzorca na początku jako opcjonalne podwzorów, zamiast tego, trzeba dopasować je obligatoryjnie, ale umieścić w opcjonalnym grupy:
(?:[0-9]+)?\(*([a-z]+[₀-₉]*)+\)*[₀-₉]*
Zobacz regex demo
Twoja [0-9]* ??
zamieniła się w (?:[0-9]+)?
. Zauważ, że tutaj nie musisz używać leniwa wersja kwantyfikatora ?
, będzie działać tak samo jak chciwy. Usunąłem również 2 niepotrzebne zewnętrzne grupy (...)
.
Ponieważ grupa (?:[0-9]+)?
jest opcjonalna, spacja zostanie dopasowana tylko wtedy, gdy przed nią znajduje się cyfra. Jeśli nie ma cyfry, następnym znakiem, który można dopasować, jest zero lub więcej (
. Wtedy powinna być obecna litera [a-z]
(jeśli nie ma (
, litera będzie pierwszą postacią w meczu).
Pozwól mi rozbicie go:
(?:[0-9]+)?
- opcjonalnie jedna lub więcej cyfr po nim spacja
\(*
- zero lub więcej (
(może chodziło ?
)
([a-z]+[₀-₉]*)+
- zero lub więcej sekwencje jednego lub większej liczby liter następuje zero lub więcej cyfr sbscript
\)*
- zero lub więcej )
(być może chodziło o ?
)
[₀-₉]*
- zero lub więcej indeksie dolnym cyfry
Jeśli chcesz również upewnić się, że nie pasują (Ca
lub H)
, należy również podzielić \(*...\)*
takiego:
(?:[0-9]+)?(?:(?:[a-z]+[₀-₉]*)+|\((?:[a-z]+[₀-₉]*)+\))[₀-₉]*
widoczny another demo
Nie widzę spacji na końcu. – Maroun
jak '(((: [0-9] +) \ (* ([A-Z] + [₀-₉] *) + \) * [₀-₉] *)?)'? –
@ WiktorStribiżew Tak, to zadziałało. Dzięki! Możesz to opublikować jako odpowiedź, a ja to zaakceptuję. – tobloef