繁体   English   中英

从括号出现开始的单独字符串(正则表达式)

[英]Separate string starting from a parenthesis occurrence (regex)

我怎样才能实现这样的目标:"Ca(OH)2" => "Ca" 和 "(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]+正则表达式匹配

  • \\([A-Za-z0-9]+\\)[0-9]* - ( , 一个或多个 ASCII 字母/数字, )然后是零个或多个数字
  • | - 或者
  • [A-Za-z0-9]+ - 一个或多个 ASCII 字母/数字。

请参阅正则表达式演示 也可以写成

Pattern p = Pattern.compile("\\(\\p{Alnum}+\\)\\d*|\\p{Alnum}+");

试试这个伙伴:

String[] segments = compound.split("([^\\w*])");

所以输出应该是:

ca , oh ,2 

希望它会帮助你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM