[英]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.