正则表达式 – 用于匹配化学公式的严格正则表达式
在使用Perl处理大型文本化学数据库的过程中,我遇到了使用正则表达式匹配化学式的问题.我之前看过
these
two主题,但建议的答案对我的要求太宽松了.
具体来说,我(无可否认有限)的研究使我得到了this posting,它给出了目前公认的化学符号的正则表达式,我将在这里复制以供参考 [BCFHIKNOPSUVWY]|[ISZ][nr]|[ACELP][ru]|A[cglmst]|B[aehikr]|C[adeflos]|D[bsy]|Es|F[elmr]|G[ade]|H[efgos]|Kr|L[aiv]|M[cdgnot]|N[abdehiop]|O[gs]|P[abdmot]|R[abe-hnu]|S[bcegim]|T[abcehilms]|Xe|Yb (例如,C,Cm和Cn将通过,但不会通过Cg或Cx.) 与前面的问题一样,我还需要匹配数字,完整的括号和完整的方括号组,以便例如匹配C2H6O和(CH3)2CFCOO(CH2)2Si(CH3)2Cl. 那么如何将以前的解决方案与大正则表达式相结合,以匹配有效的化学元素,以严格匹配化学式? (如果添加起来并不是太麻烦,那么如何人工解析正则表达式的详细描述将会受到极大的赞赏,尽管不是绝对必要的.) 解决方法
简要
我决定为什么不创建一个大规模的正则表达式来做你想要的(但仍然保持一个干净的正则表达式).此正则表达式将与循环结合使用,以检查括号或括号组的匹配项. 假设 由于OP没有给出正面和负面匹配的完整列表,我假设如下: >嵌套括号是不可能的 如果这些假设中的任何一个不正确,请告诉我,以便我可以相应地修复正则表达式 回答 View this regex in use here 码 (?(DEFINE) (?# Periodic elements ) (?<Hydrogen>H) (?<Helium>He) (?<Lithium>Li) (?<Beryllium>Be) (?<Boron>B) (?<Carbon>C) (?<Nitrogen>N) (?<Oxygen>O) (?<Fluorine>F) (?<Neon>Ne) (?<Sodium>Na) (?<Magnesium>Mg) (?<Aluminum>Al) (?<Silicon>Si) (?<Phosphorus>P) (?<Sulfur>S) (?<Chlorine>Cl) (?<Argon>Ar) (?<Potassium>K) (?<Calcium>Ca) (?<Scandium>Sc) (?<Titanium>Ti) (?<Vanadium>V) (?<Chromium>Cr) (?<Manganese>Mn) (?<Iron>Fe) (?<Cobalt>Co) (?<Nickel>Ni) (?<Copper>Cu) (?<Zinc>Zn) (?<Gallium>Ga) (?<Germanium>Ge) (?<Arsenic>As) (?<Selenium>Se) (?<Bromine>Br) (?<Krypton>Kr) (?<Rubidium>Rb) (?<Strontium>Sr) (?<Yttrium>Y) (?<Zirconium>Zr) (?<Niobium>Nb) (?<Molybdenum>Mo) (?<Technetium>Tc) (?<Ruthenium>Ru) (?<Rhodium>Rh) (?<Palladium>Pd) (?<Silver>Ag) (?<Cadmium>Cd) (?<Indium>In) (?<Tin>Sn) (?<Antimony>Sb) (?<Tellurium>Te) (?<Iodine>I) (?<Xenon>Xe) (?<Cesium>Cs) (?<Barium>Ba) (?<Lanthanum>La) (?<Cerium>Ce) (?<PraSEOdymium>Pr) (?<Neodymium>Nd) (?<Promethium>Pm) (?<Samarium>Sm) (?<Europium>Eu) (?<Gadolinium>Gd) (?<Terbium>Tb) (?<Dysprosium>Dy) (?<Holmium>Ho) (?<Erbium>Er) (?<Thulium>Tm) (?<Ytterbium>Yb) (?<Lutetium>Lu) (?<Hafnium>Hf) (?<Tantalum>Ta) (?<Tungsten>W) (?<Rhenium>Re) (?<Osmium>Os) (?<Iridium>Ir) (?<Platinum>Pt) (?<Gold>Au) (?<Mercury>Hg) (?<Thallium>Tl) (?<Lead>Pb) (?<Bismuth>Bi) (?<Polonium>Po) (?<Astatine>At) (?<Radon>Rn) (?<Francium>Fr) (?<Radium>Ra) (?<Actinium>Ac) (?<Thorium>Th) (?<Protactinium>Pa) (?<Uranium>U) (?<Neptunium>Np) (?<Plutonium>Pu) (?<Americium>Am) (?<Curium>Cm) (?<Berkelium>Bk) (?<Californium>Cf) (?<Einsteinium>Es) (?<Fermium>Fm) (?<Mendelevium>Md) (?<Nobelium>No) (?<Lawrencium>Lr) (?<Rutherfordium>Rf) (?<Dubnium>Db) (?<Seaborgium>Sg) (?<Bohrium>Bh) (?<Hassium>Hs) (?<Meitnerium>Mt) (?<Darmstadtium>Ds) (?<Roentgenium>Rg) (?<Copernicium>Cn) (?<Nihonium>Nh) (?<Flerovium>Fl) (?<Moscovium>Mc) (?<Livermorium>Lv) (?<Tennessine>Ts) (?<Oganesson>Og) (?# Regex ) (?<Element>(?&Actinium)|(?&Silver)|(?&Aluminum)|(?&Americium)|(?&Argon)|(?&Arsenic)|(?&Astatine)|(?&Gold)|(?&Barium)|(?&Beryllium)|(?&Bohrium)|(?&Bismuth)|(?&Berkelium)|(?&Bromine)|(?&Boron)|(?&Calcium)|(?&Cadmium)|(?&Cerium)|(?&Californium)|(?&Chlorine)|(?&Curium)|(?&Copernicium)|(?&Cobalt)|(?&Chromium)|(?&Cesium)|(?&Copper)|(?&Carbon)|(?&Dubnium)|(?&Darmstadtium)|(?&Dysprosium)|(?&Erbium)|(?&Einsteinium)|(?&Europium)|(?&Iron)|(?&Flerovium)|(?&Fermium)|(?&Francium)|(?&Fluorine)|(?&Gallium)|(?&Gadolinium)|(?&Germanium)|(?&Helium)|(?&Hafnium)|(?&Mercury)|(?&Holmium)|(?&Hassium)|(?&Hydrogen)|(?&Indium)|(?&Iridium)|(?&Iodine)|(?&Krypton)|(?&Potassium)|(?&Lanthanum)|(?&Lithium)|(?&Lawrencium)|(?&Lutetium)|(?&Livermorium)|(?&Moscovium)|(?&Mendelevium)|(?&Magnesium)|(?&Manganese)|(?&Molybdenum)|(?&Meitnerium)|(?&Sodium)|(?&Niobium)|(?&Neodymium)|(?&Neon)|(?&Nihonium)|(?&Nickel)|(?&Nobelium)|(?&Neptunium)|(?&Nitrogen)|(?&Oganesson)|(?&Osmium)|(?&Oxygen)|(?&Protactinium)|(?&Lead)|(?&Palladium)|(?&Promethium)|(?&Polonium)|(?&PraSEOdymium)|(?&Platinum)|(?&Plutonium)|(?&Phosphorus)|(?&Radium)|(?&Rubidium)|(?&Rhenium)|(?&Rutherfordium)|(?&Roentgenium)|(?&Rhodium)|(?&Radon)|(?&Ruthenium)|(?&Antimony)|(?&Scandium)|(?&Selenium)|(?&Seaborgium)|(?&Silicon)|(?&Samarium)|(?&Tin)|(?&Strontium)|(?&Sulfur)|(?&Tantalum)|(?&Terbium)|(?&Technetium)|(?&Tellurium)|(?&Thorium)|(?&Titanium)|(?&Thallium)|(?&Thulium)|(?&Tennessine)|(?&Uranium)|(?&Vanadium)|(?&Tungsten)|(?&Xenon)|(?&Ytterbium)|(?&Yttrium)|(?&Zirconium)|(?&Zinc)) (?<Num>(?:[1-9]d*)?) (?<ElementGroup>(?:(?&Element)(?&Num))+) (?<ElementParenthesesGroup>((?&ElementGroup)+)(?&Num)) (?<ElementSquareBracketGroup>[(?:(?:(?&ElementParenthesesGroup)(?:(?&ElementGroup)|(?&ElementParenthesesGroup))+)|(?:(?:(?&ElementGroup)|(?&ElementParenthesesGroup))+(?&ElementParenthesesGroup)))](?&Num)) ) ^((?<Brackets>(?&ElementSquareBracketGroup))|(?<Parentheses>(?&ElementParenthesesGroup))|(?<Group>(?&ElementGroup)))+$ 说明 >(?(DEFINE))部分的第一部分列出了每个周期性元素(按原子序数排序以便于查找). >有效示例 > C – 元素 >无效的示例 > N0 – 0不能明确使用 > ElementParenthesesGroup指定括号()之间但仍包含至少一个ElementGroup的ElementGroup的一个或多个分组 >有效示例 >(CH) – 由括号括起来的ElementGroup >无效的示例 >(CH [NO4]) – 只有ElementGroup在ElementParenthesesGroup中有效 > ElementSquareBracketGroup指定方括号[]之间的ElementParenthesesGroup或ElementGroup的分组,但包含至少一个ElementParenthesesGroup和另一个组(ElementParenthesesGroup或ElementGroup) >有效示例 > [CH3(NO4)] – 包含至少一个ElementParenthesesGroup和另一个ElementParenthesesGroup或ElementGroup >无效的示例 > [(NO4)] – 不包含第二组,括号[]是多余的 附加信息 我意识到这是一个很长的答案,但OP正在提出一个非常具体的问题,并希望确保满足特定的标准. 确保设置以下标志: > g – 确保全局匹配 注意:正则表达式只捕获它找到的最后一个类型X(并覆盖先前捕获的所述类型X的组.这是正则表达式的默认行为,并且当前无法覆盖此行为.这可能会让您不受欢迎您可以使用链接正则表达式中的最后一个示例以及(CH3)2CFCOO(CH2)2Si(CH3)2Cl的示例来看到这一点,因为每个组类型都有多个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |