Java – 按编号和字母拆分字符串
所以我有一个像这个C3H20IO
这样的字符串
我想做的是拆分这个字符串,所以我得到以下内容:
Array1 = {C,H,I,O} Array2 = {3,20,1,1}
作为Array2
的第三个元素的1
表示I
元素的单primefaces性质。 O
。 这实际上是我正在努力的部分。
这是一个化学方程,所以我需要根据它们的名称和primefaces数等来分离元素。
你可以尝试这种方法:
String formula = "C3H20IO"; //insert "1" in atom-atom boundry formula = formula.replaceAll("(?<=[AZ])(?=[AZ])|(?<=[az])(?=[AZ])|(?<=\\D)$", "1"); //split at letter-digit or digit-letter boundry String regex = "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"; String[] atoms = formula.split(regex);
输出:
primefaces:[C,3,H,20,I,1,O,1]
现在所有偶数索引(0,2,4 ......)都是primefaces而奇数是相关的数字:
String[] a = new String[ atoms.length/2 ]; int[] n = new int[ atoms.length/2 ]; for(int i = 0 ; i < a.length ; i++) { a[i] = atoms[i*2]; n[i] = Integer.parseInt(atoms[i*2+1]); }
输出:
a:[C,H,I,O]
n:[3,20,1,1]
您可以使用正则表达式使用Matcher.find()方法在输入上滑动。
这里有一个粗略的例子:
String input = "C3H20IO"; List array1 = new ArrayList (); List array2 = new ArrayList (); Pattern pattern = Pattern.compile("([AZ][az]*)([0-9]*)"); Matcher matcher = pattern.matcher(input); while(matcher.find()){ array1.add(matcher.group(1)); String atomAmount = matcher.group(2); int atomAmountInt = 1; if((atomAmount != null) && (!atomAmount.isEmpty())){ atomAmountInt = Integer.valueOf(atomAmount); } array2.add(atomAmountInt); }
我知道,缺少从List到Array的转换,但它应该让您了解如何解决您的问题。
没有REGEX
的方法和使用ArrayList
存储的数据:
String s = "C3H20IO"; char Chem = '-'; String val = ""; boolean isFisrt = true; List chemList = new ArrayList (); List weightList = new ArrayList (); for (char c : s.toCharArray()) { if (Character.isLetter(c)) { if (!isFisrt) { chemList.add(Chem); weightList.add(Integer.valueOf(val.equals("") ? "1" : val)); val = ""; } Chem = c; } else if (Character.isDigit(c)) { val += c; } isFisrt = false; } chemList.add(Chem); weightList.add(Integer.valueOf(val.equals("") ? "1" : val)); System.out.println(chemList); System.out.println(weightList);
OUTPUT:
[C, H, I, O] [3, 20, 1, 1]
这可以假设每个元素都以大写字母开头,即如果你有“Fe”,你就不会在字符串中将它表示为“FE”。 基本上,您在每个大写字母上拆分字符串,然后按字母和数字拆分每个新字符串,如果新拆分不包含数字,则添加“1”。
String s = "C3H20IO"; List letters = new ArrayList<>(); List numbers = new ArrayList<>(); String[] arr = s.split("(?=\\p{Upper})"); // [C3, H20, I, O] for (String str : arr) { //[C, 3]:[H, 20]:[I]:[O] String[] temp = str.split("(?=\\d)", 2); letters.add(temp[0]); if (temp.length == 1) { numbers.add("1"); } else { numbers.add(temp[1]); } } System.out.println(Arrays.asList(letters)); //[[C, H, I, O]] System.out.println(Arrays.asList(numbers)); //[[3, 20, 1, 1]]
使用输入长度的大小make(for循环)并添加以下条件
if(i==number) // add it to the number array if(i==character) //add it into character array
我建议使用零宽度前瞻正则表达式分割大写字母(以提取像C12
, O2
, Si
这样的项目),然后将每个项目拆分为元素及其数字权重:
List elements = new ArrayList<>(); List weights = new ArrayList<>(); String[] items = "C6H12Si6OH".split("(?=[AZ])"); // [C6, H12, Si6, O, H] for (String item : items) { String[] pair = item.split("(?=[0-9])", 2); // eg H12 => [H, 12], O => [O] elements.add(pair[0]); weights.add(pair.length > 1 ? Integer.parseInt(pair[1]) : 1); } System.out.println(elements); // [C, H, Si, O, H] System.out.println(weights); // [6, 12, 6, 1, 1]
这个好吗? (不使用split
)
正则表达式演示
String line = "C3H20ZnO2ABCD"; String pattern = "([AZ][az]*)(((?=[AZ][az]*|$))|\\d+)"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); while (m.find( )) { System.out.print(m.group(1)); if (m.group(2).length() == 0) { System.out.println(" 1"); } else { System.out.println(" " + m.group(2)); } }
IDEONE DEMO
您可以使用像(?<= \ D)(?= \ d)这样的正则表达式来拆分字符串。 尝试这个 :
String alphanum= "abcd1234"; String[] part = alphanum.split("(?<=\\D)(?=\\d)"); System.out.println(part[0]); System.out.println(part[1]);
将输出
abcd 1234
我这样做了如下
ArrayList integerCharacters = new ArrayList(); ArrayList stringCharacters = new ArrayList<>(); String value = "C3H20IO"; //Your value String[] strSplitted = value.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); //Split numeric and strings for(int i=0; i
您可以使用两种模式:
- [0-9]
- [A-ZA-Z]
每次拆分两次。
List letters = Arrays.asList(test.split("[0-9]")); List numbers = Arrays.asList(test.split("[a-zA-Z]")) .stream() .filter(s -> !s.equals("")) .collect(Collectors.toList()); if(letters.size() != numbers.size()){ numbers.add("1"); }