我怎样才能做到这样:"Ca(OH)2"=比;"Ca"one_answers"(OH) 2,
在python中可以这样实现:
import re
compound = "Ca(OH)2"
segments=re.split('(([A-Za-z0-9]*)[0-9]*)',compound)
print(segments)
Output: ['Ca', '(OH)2', '']
我从https://medium.com/swlh/balancing-chemical-equations-with-python-837518c9075b(除了我想在Java中做它)遵循这个教程
(([A-Za-z0-9]*)[0-9]*)
为了分解正则表达式,最外层的括号(靠近单引号)表明这是我们的捕获组,这是我们想要保留的。内括号前面的正斜杠表示我们想要从字面上找到括号(这称为转义),[a- za -z0 - 9]表明我们可以在括号内使用任何字母(任何大小写)或数字,方括号后面的星号是量词。这意味着我们可以在括号内使用零或无限多个字母(任何情况下)或数字。和末尾的[0-9]表示我们希望在分割中包括括号右边的所有数字。
我尝试在Java中这样做,但输出不是我想要的:
String compound = "Ca(OH)2";
String[] segments = compound.split("(\([A-Za-z0-9]*\)[0-9]*)");
System.out.println(Arrays.toString(segments));
Output: [Ca]
在Java中,与Python的re.split
方法不同,String#split
不保留捕获的部分。
您可以在Java中使用以下代码:
String s = "Ca(OH)2";
Pattern p = Pattern.compile("\([A-Za-z0-9]+\)[0-9]*|[A-Za-z0-9]+");
Matcher m = p.matcher(s);
List<String> res = new ArrayList<>();
while(m.find()) {
res.add(m.group());
}
System.out.println(res); // => [Ca, (OH)2]
参见在线演示。这里,([A-Za-z0-9]+)[0-9]*|[A-Za-z0-9]+
regex匹配
([A-Za-z0-9]+)[0-9]*
-(
,一个或多个ASCII字母/数字,)
,然后0个或多个数字|
-或[A-Za-z0-9]+
-一个或多个ASCII字母/数字。
参见regex演示。也可以写成
Pattern p = Pattern.compile("\(\p{Alnum}+\)\d*|\p{Alnum}+");
试试这个:
String[] segments = compound.split("([^\w*])");
所以输出应该是:
ca , oh ,2
希望它会帮助你!