我需要一种将化学式分离为其成分的方法。结果应如下所示:
Ag3PO4 -> [Ag3, P, O4]
H2O -> [H2, O]
CH3OOH -> [C, H3, O, O, H]
Ca3(PO4)2 -> [Ca3, (PO4)2]
我不知道regex语法,但是我知道我需要像这样的东西
[可选括号] [大写字母] [0个或多个小写字母] [0个或多个数字] [可选括号] [0个或多个数字]
这工作
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:@"[A-Z][a-z]*\\d*|\\([^)]+\\)\\d*"
options:0
error:nil];
NSArray *tests = [[NSArray alloc ] initWithObjects:@"Ca3(PO4)2", @"HCl", @"CaCO3", @"ZnCl2", @"C7H6O2", @"BaSO4", nil];
for (NSString *testString in tests)
{
NSLog(@"Testing: %@", testString);
NSArray *myArray = [regex matchesInString:testString options:0 range:NSMakeRange(0, [testString length])] ;
NSMutableArray *matches = [NSMutableArray arrayWithCapacity:[myArray count]];
for (NSTextCheckingResult *match in myArray) {
NSRange matchRange = [match rangeAtIndex:0];
[matches addObject:[testString substringWithRange:matchRange]];
NSLog(@"%@", [matches lastObject]);
}
}
(PO4)2
真的坐在所有人旁边。
让我们从没有括号的简单匹配项开始:
[A-Z][a-z]?\d*
使用正则表达式上面我们可以成功的解析Ag3PO4
,H2O
,CH3OOH
。
然后,我们需要以某种方式为组添加表达式。分组本身可以使用以下方式匹配:
\(.*?\)\d+
因此,我们添加or
条件:
[A-Z][a-z]?\d*|\(.*?\)\d+
在特定情况下适用。但也许您还有更多样本。
注意:嵌套括号会出现问题。例如Co3(Fe(CN)6)2
如果要处理这种情况,可以使用以下正则表达式:
[A-Z][a-z]?\d*|(?<!\([^)]*)\(.*\)\d+(?![^(]*\))
对于Objective-C,您可以使用不带环顾四周的表达式:
[A-Z][a-z]?\d*|\([^()]*(?:\(.*\))?[^()]*\)\d+
还是带有重复的正则表达式(我不知道这样的公式,但是如果有类似的情况A(B(CD)3E(FG)4)5
-一个括号内有多个括号块。
[A-Z][a-z]?\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句