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 

我建议使用零宽度前瞻正则表达式分割大写字母(以提取像C12O2Si这样的项目),然后将每个项目拆分为元素及其数字权重:

 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"); }