从括号开始的单独字符串(regex)



我怎样才能做到这样:"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 

希望它会帮助你!

最新更新