小文字の化学式のあいまいさを解決しようとしています。一部の要素名は他の要素名のサブストリングであり、それらはすべて一緒に実行されるため、同じパターンに対して複数のグローバル一致が存在する可能性があります。
/^((h)|(s)|(hg)|(ga)|(as))+$/
文字列に対する正規表現を検討しますhgas
。一致する可能性のあるものは2つあります。hg, as
およびh, s, ga
(入力と比較して順序が狂っていますが、問題はありません)。明らかに、すべての可能なシンボルの正規表現は長くなりますが、この例は簡単にするために行われました。
正規表現の強力な先読みと後読みにより、非常に長い文字列でさえこのパターンに一致するか、文字の可能な順列がないかを最終的に判断できます。一致する可能性のあるすべての順列を熱心に試します。たとえば、文字列の最後に残り物が当たった場合は、g
戻って別の組み合わせを再試行します。
正規表現、またはある種の拡張機能を備えた言語を探しています。これにより、一致が見つかった後も検索を続けることができます。この場合は、検索h, s, ga
も同様hg, as
です。
この問題に対する正規表現の複雑な先読み機能と後読み機能を再構築することは、特に最終的な正規表現に各記号の後に\ d *が含まれていることを考えると、合理的な解決策とは思えません。
正規表現の順序を逆にして、追加のマッピングを見つけることを考えまし/^((as)|(ga)|(hg)|(s)|(h))+$/
たが、多くても1つの追加の一致しか見つかりません。また、正規表現の理論的背景がなく、試してみるのが合理的かどうかもわかりません。
既存の正規表現を使用してサンプルページを作成しました。この正規表現は、指定された小文字の文字列に一致するものを1つまたは0つ見つけて、適切に大文字で(順序が狂って)返します。マッチングでは最初の100個の化学記号を使用します。
http://www.ptable.com/Script/lowercase_formula.php?formula=hgas
tl; dr:文字列内の0または1つの可能な化学式の順列に一致する正規表現があります。複数の一致を見つけるにはどうすればよいですか?