/
(?<![A-Za-z0-9]) # left boundary: don't start in the middle of a letter/number run
(?![^<>]*>) # HTML guard: skip if a ">" is reachable before a "<" (i.e. inside a tag)
(?<SMILES> # ================ capture: the whole SMILES ================
# ---- FIRST COMPONENT ----
(?: # an atom:
\[[0-9]* # bracket atom: "[" , optional isotope digits,
(?:
(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U) # a valid element symbol,
|(?:se|as|[bcnops]) # or a lowercase aromatic atom,
|\* # or a wildcard
)
[^\]]*\] # then charge / H-count / chirality, up to "]"
|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*) # OR an unbracketed organic-subset atom
)
(?: # optional chain after the atom:
(?: # zero+ interior tokens...
(?:\[[0-9]*(?:(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U)|(?:se|as|[bcnops])|\*)[^\]]*\]|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*)) # an atom (same shape as above),
|[=#$:\/\\\-] # or a bond ( = # $ : / \ - ),
|[()] # or a branch paren,
|(?:%[0-9]{2}|[0-9]) # or a ring closure ( %NN or single digit )
)*
(?: # ...then a required terminal token (never a dangling bond):
(?:\[[0-9]*(?:(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U)|(?:se|as|[bcnops])|\*)[^\]]*\]|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*)) # an atom,
|%[0-9]{2} # or a two-digit ring closure,
|[0-9)] # or a closing digit / paren
)
)?
(?: # ---- ADDITIONAL "."-SEPARATED COMPONENTS (salts, hydrates, ions) ----
\. # component separator "."
(?:\[[0-9]*(?:(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U)|(?:se|as|[bcnops])|\*)[^\]]*\]|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*)) # first atom of this component
(?: # optional chain after the atom:
(?: # zero+ interior tokens...
(?:\[[0-9]*(?:(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U)|(?:se|as|[bcnops])|\*)[^\]]*\]|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*)) # an atom (same shape as above),
|[=#$:\/\\\-] # or a bond ( = # $ : / \ - ),
|[()] # or a branch paren,
|(?:%[0-9]{2}|[0-9]) # or a ring closure ( %NN or single digit )
)*
(?: # ...then a required terminal token (never a dangling bond):
(?:\[[0-9]*(?:(?:H[eogsf]?|L[iavru]|B[eahkri]?|C[arofmusenld]?|N[eiahopdb]?|O[sg]?|F[rle]?|M[godtcn]|A[lrsgutmc]|S[icerngmb]?|P[uabotmrd]?|Kr?|T[icebmsalh]|V|Z[nr]|G[ade]|R[buhenagf]|Yb?|I[nr]?|Xe|E[urs]|D[ysb]|W|U)|(?:se|as|[bcnops])|\*)[^\]]*\]|(?:Cl|Br|[BCNOFPSI]|[bcnops]|\*)) # an atom,
|%[0-9]{2} # or a two-digit ring closure,
|[0-9)] # or a closing digit / paren
)
)?
)*
) # ================ end capture ================
(?![A-Za-z0-9]) # right boundary: don't end in the middle of a letter/number run
/
gmx