我正在尝试解决小写化学式中的歧义。由于某些元素名称是其他元素名称的子字符串,并且它们都一起运行,因此同一模式可以有多个全局匹配。
考虑/^((h)|(s)|(hg)|(ga)|(as))+$/
针对字符串的正则表达式hgas
。有两种可能的匹配。hg, as
和h, s, ga
(与输入相比无序,但不是问题)。显然,所有可能符号的正则表达式会更长,但这个例子是为了简单起见。
正则表达式强大的前瞻和后瞻功能使其能够最终确定即使是很长的字符串是否与此模式匹配,或者是否有可能的字母排列。它将努力尝试所有可能的匹配排列,例如,如果它以 leftover 命中字符串的末尾,则g
返回并重试不同的组合。
我正在寻找一个正则表达式,或者一种具有某种扩展名的语言,它增加了在找到匹配项后继续查找匹配项的能力,在这种情况下,查找h, s, ga
以及hg, as
.
为这个问题重建复杂的正则表达式的前瞻和后视功能似乎不是一个合理的解决方案,特别是考虑到最终的正则表达式还在每个符号后包含一个 \d*。
我想过颠倒正则表达式的顺序/^((as)|(ga)|(hg)|(s)|(h))+$/
,以找到额外的映射,但最多只能找到一个额外的匹配项,而且我没有正则表达式的理论背景,不知道尝试是否合理。
我使用现有的正则表达式创建了一个示例页面,它为给定的小写字符串找到 1 个或 0 个匹配项,并将其正确大写(并且无序)返回。它在匹配中使用前 100 个化学符号。
http://www.ptable.com/Script/lowercase_formula.php?formula=hgas
tl; dr:我有一个正则表达式来匹配字符串中的 0 或 1 个可能的化学式排列。如何找到超过 1 个匹配项?