【问题标题】:Java Converting a group of String by replace the speacial charactersJava通过替换特殊字符来转换一组字符串
【发布时间】:2023-03-22 17:35:01
【问题描述】:
public static void main(String[] args) {
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj";
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(str);
    List<String> strings = new ArrayList<String>();
    List<Integer> nums = new ArrayList<Integer>();
    while (m.find()) {
        nums.add(Integer.parseInt(m.group()));
    }
    p = Pattern.compile("[a-z]+");
    m = p.matcher(str);
    while (m.find()) {
        strings.add(m.group());
    }
    System.out.println(nums);
    System.out.println(strings);
}

输出:

[12, 124, 1234, 123, 1234]
[astv, atthh, ggh, dhr, sfff, dgdfg, mnaoj]

但我想要这样的输出:

[12124, 1234123, 1234]
[astv, atthhggh, dhrsfff, dgdfg, mnaoj]

【问题讨论】:

  • 您为什么不想要12124123?您需要提供一些选择标准。
  • 请澄清您的问题。你能解释一下你试图实现的逻辑吗?
  • 我有一个类似 "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj" 的字符串,我想将数字和字符串分别拆分成这样的列表 [astv, atthhggh, dhrsfff, dgdfg, mnaoj] [12124, 1234123, 1234]
  • 您需要澄清为什么12124 在列表中而12 不在列表中。两者都出现在字符串中,但只有前者在您的列表中。
  • @ManojKumarGovindharaj 是的,这很清楚。我不明白为什么12124 应该组合在一起,而1241234 不应该。

标签: java arrays string list replace


【解决方案1】:

您可以将 split 与 * 一起使用,然后您可以使用每个元素,例如:

public static void main(String[] args) {
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj";
    String[] spl = str.split("\\*");//[astv, 12atthh124ggh, dhr1234sfff123, dgdfg1234, mnaoj]
    List<String> strings = new ArrayList<>();
    List<Integer> nums = new ArrayList<>();
    for (String s : spl) {

        String tmp = s.replaceAll("\\d+", "");//replace all the digits with empty
        if (!tmp.trim().isEmpty()) {
            strings.add(tmp);
        }

        tmp = s.replaceAll("[a-z]+", "");//replace all the character with empty
        if (!tmp.trim().isEmpty()) {
            nums.add(Integer.parseInt(tmp));
        }
    }

    System.out.println(nums);
    System.out.println(strings);
}

输出

[12124, 1234123, 1234]
[astv, atthhggh, dhrsfff, dgdfg, mnaoj]

Ideone demo

【讨论】:

  • 初始没有pattern complie,需要与那个字符正确分割
【解决方案2】:

要保留原始的正则表达式逻辑,您可以执行以下操作:

public static void main(String[] args) {
    String str = "astv*12atthh124ggh*dhr1234sfff123*dgdfg1234*mnaoj";
    List<String> strings = new ArrayList<>();
    List<Integer> nums = new ArrayList<>();
    Pattern digitPattern = Pattern.compile("\\d+");
    Pattern alphaPattern = Pattern.compile("[a-z]+");
    String[] splittedArray = str.split("\\*");
    for (String nextSplittedString : splittedArray) {
        Matcher digitMatcher = digitPattern.matcher(nextSplittedString);
        Matcher alphaMatcher = alphaPattern.matcher(nextSplittedString);
        String nextDigitAsString = "";
        while (digitMatcher.find()) {
            nextDigitAsString += digitMatcher.group();
        }
        if (!nextDigitAsString.isEmpty()) {
            nums.add(Integer.parseInt(nextDigitAsString));
        }

        String nextString = "";
        while (alphaMatcher.find()) {
            nextString += alphaMatcher.group();
        }
        if (!nextString.isEmpty()) {
            strings.add(nextString);
        }
     }
     System.out.println(nums);
     System.out.println(strings);
}

输出

[12124, 1234123, 1234]
[astv, atthhggh, dhrsfff, dgdfg, mnaoj]

Ideone demo

【讨论】:

    【解决方案3】:

    要获取数字数组,可以

    • 用空字符串替换所有字母
    • 用星号分割*

    - 代码

    String digitArr[] = str.replaceAll("[A-Za-z]", "").split("\\*");
    //output
    //12124 1234123 1234 
    

    你可以重复同样的事情来获取字母数组

    String stringArr[] = str.replaceAll("[0-9]", "").split("\\*");
    //Output
    //astv atthhggh dhrsfff dgdfg mnaoj 
    

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2011-05-08
      • 2018-12-13
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多