我怎樣才能實作這樣的目標:"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]
uj5u.com熱心網友回復:
在 Java 中,與 Pythonre.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} ");
uj5u.com熱心網友回復:
試試這個伙伴:
String[] segments = compound.split("([^\\w*])");
所以輸出應該是:
ca , oh ,2
希望它會幫助你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334548.html
