Java Groovy Grails
2019. 12. 6. 05:17
import java.util.regex.Pattern
import java.util.regex.Matcher
String pattern_elements="A[cglmrstu]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|B[aehikr]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|C[adeflmnorsu]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|D[bsy]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|E[rsu]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|F[elmr]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|G[ade]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|H[efgos]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|I[nr]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|Kr?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|L[airuv]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|M[dgnot]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|N[abdeiop]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|Os?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|P[abdmortu]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|R[abefghnu]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|S[bcegimnr]?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|T[abcehilm]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|U(u[opst])?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|V([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|W([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|Xe([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|Yb?([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)|Z[nr]([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)"
def parseCompound(String comp){
Pattern pattern = Pattern.compile(pattern_elements)
List<String> listElementGroups = new ArrayList<String>()
List<String> listElementGroups_withCount = new ArrayList<String>()
Matcher m = pattern.matcher(comp)
while (m.find()){
def ele = m.group()
//println ("m.group():"+ ele)
def ele_digit=0.0
def ele_sym = ele.matches(".*\\d+.*") ? ele.replaceAll("([0-9]\\/[0-9]|[0-9]*\\.?[0-9]+|[0-9]*)","").toString() : ele
//println("ele_sym: "+ele_sym)
if (ele.matches(".*[0-9]\\/[0-9].*")){ // fractions
def ele_digit_temp = ele.replaceAll(ele_sym,"")
def two_nums = ele_digit_temp.split("/")
ele_digit = Float.parseFloat(two_nums[0]) / Float.parseFloat(two_nums[1])
ele_digit = ele_digit.round(3)
}
else{ // integer, float or empty
ele_digit = ele.matches(".*\\d+.*") ? Float.parseFloat(ele.replaceAll(ele_sym,"")) : 1
}
ele_digit = ele_digit > 1.0 ? ele_digit.round() : ele_digit
listElementGroups.add(ele)
listElementGroups_withCount.add(ele_sym+":"+ele_digit)
}
return listElementGroups_withCount
}