【问题标题】:Extracting pattern from string with unknown length从长度未知的字符串中提取模式
【发布时间】:2014-11-10 15:05:51
【问题描述】:

我仍处于 Java 的初级阶段,我正在尝试弄清楚如何提取所有特定值。

以这种形式(模式)[A-H][1-8] 出一个长度未知的字符串。
例如,如果我的字符串是" F5 F4 E3 ",我想将F5 分配给一个变量,F4 分配给一个变量,E3 分配给另一个变量。

或者,如果我的字符串是 " A2 ",我想将 A2 分配给一个变量。
我有一种感觉,我应该使用 Array 来存储值。
请注意,想要的模式之间有空格"blankE2blank"

这是我目前的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Arrays;

public class List {
    public static void main(String[] args) {

        int i = 0;
        char[] Wanted = new char[]{?}; // What should I use here?
        Pattern pat = Pattern.compile("\\s*d+\\s*D+\\s*d+");
        String Motherstring = " F5 F4 E3 "; // this is just an example but the extraction should work for every string
        Matcher m = pat.matcher(Motherstring);
        while (pat.find()) {
            Wanted[i] = pat; // ?
            i++;
        }
    }
}

【问题讨论】:

  • 只需使用String#split将输入按空格"\\s+"分割并处理结果数组String[]

标签: java regex pattern-matching


【解决方案1】:

不要使用数组。使用List。大小是动态的,允许您add 对象。看到这个:

Pattern pattern = Pattern.compile("[A-H][1-8]");
Matcher matcher = pattern.matcher(" F5 F4 E3 ");

// Create a new list (ArrayList) to store Strings.
ArrayList<String> list = new ArrayList<>();

// For every match of the regexp in the test string:
while (matcher.find())
    // Add the match to the list.
    list.add(matcher.group());

System.out.println(list);

这是online code demo。 STDOUT 打印:

[F5, F4, E3]

【讨论】:

  • 我同意,这里最好动态收集
【解决方案2】:

您可以使用\b 锚。下面是手写的例子,我没有测试过。它只是展示了这个想法。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Arrays;

public class List {
    public static void main(String[] args) {

        int i = 0;
        char[] Wanted = new char[3];// Instead of array any dynamic collection should be used here. Since I'm not familiar with Java collections enough, Im leaving array here for correct work
        Pattern pat = Pattern.compile("\\b\\w+\\b");
        String Motherstring = " F5 F4 E3 ";
        Matcher m = pat.matcher(Motherstring);
        while (pat.find()) {
            Wanted[i]= pat.group();
            i++;
        }
    }
}

【讨论】:

  • 感谢一百万终于弄明白了!
  • 希望对其他人也有帮助!
  • 实际上,我很高兴您关心我的评论并提供反馈,因此您已经通过了其他所有人大喊“omg y u downvotes”的简单过滤器,所以现在我可以与您进行更多交流关于你的代码。意图和流程很明确,但您没有意识到: 1. 字段未命名为 Java 语义camelCasing 2. 模式限制不够,您可以完全简化 char 初始化:
  • 对不起,我对Java不够熟悉,集合也不在这个问题的范围内。我也完全同意,动态集合要好得多。
  • char[] wanted = new char[motherString.replaceFirst("\\W+").replaceAll("\\w*(\\w)\\W*", "$1").length()],它采用唯一的单词字符序列,减去所有内容并留下一个,然后获取最终长度并将其用作数组的长度,这将恰好适合您正在Pattern.compile("\\b\\w+\\b")做。
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多