用于匹配和存储任何整数的Java正则表达式

用于匹配和存储任何整数的Java正则表达式,java,regex,Java,Regex,现在,使用Java,我只希望它能够将任何整数字符串标记为数组 输入=1dsa23f hj23nma9123 数组=1,23,239123 我一直在尝试几种不同的方法,string.matches,然后在格式正确后进行标记,等等,但这对用户来说太有限了。看起来您正在寻找类似的东西 String[] nums = text.split("\\D+"); \D regex是\D的否定,它类似于[^\D],这意味着\D+将匹配一个或多个非数字 此解决方案的唯一问题是,如果文本以非数字开头,结果数组将以

现在,使用Java,我只希望它能够将任何整数字符串标记为数组

输入=1dsa23f hj23nma9123 数组=1,23,239123


我一直在尝试几种不同的方法,string.matches,然后在格式正确后进行标记,等等,但这对用户来说太有限了。

看起来您正在寻找类似的东西

String[] nums = text.split("\\D+");
\D regex是\D的否定,它类似于[^\D],这意味着\D+将匹配一个或多个非数字

此解决方案的唯一问题是,如果文本以非数字开头,结果数组将以一个空字符串开头

若你们仍然想使用拆分,那个么你们可以简单地从你们的文本开始删除那个非数字部分

String[] nums = text.replaceFirst("^\\D+","").split("\\D+");
除了专注于寻找分隔符的split之外,其他方法将专注于寻找我们感兴趣的部分。因此,与其搜索非数字,不如查找数字

我们可以用一些方法来做,比如Patter/Matcherfind,或者用扫描仪。这里的问题是,这些方法不返回数组,而是返回单个元素,您需要将这些元素存储在一些可调整大小的结构中,如List

因此,使用模式和匹配器的解决方案可能如下所示:

List<String> numbers = new ArrayList<>();
Matcher m = Pattern.compile("\\d+").matcher(yourText);
while(m.find()){
    numbers.add(m.group());
}
使用Scanner的解决方案类似,我们只需要将适当的分隔符设置为非数字,并读取所有不是分隔符的内容。文本开头的分隔符将被忽略,这将防止返回空字符串

List<String> nums = new ArrayList<>();
Scanner sc = new Scanner(yourText);
sc.useDelimiter("\\D+");
while(sc.hasNext()){
    nums.add(sc.next());
}

尝试一些教程。这应该是一个简单的表达:你不能只是把你的问题换成不同的问题,因为那样会使已经发布的答案无效。如果您有新问题,请在新帖子中提问。@ergonaut-我正在尝试使用从教程中学到的知识。我还没有看到这一个,所以我会看看我如何去。每个编辑都被保存,所以你可以看到它只需点击编辑。。。以前在本例中,您正在寻找。在您先前的评论中,您声称您理解我所说的将您的问题更改为新问题,该评论现已删除。那么为什么您仍在这样做呢?如果字符串没有以数字开头和结尾,这将失败,因为拆分将产生一个空部分。虽然这个答案可能是正确和有用的,但如果你想解释一下它是如何帮助解决问题的,那就更好了。这在将来变得特别有用,如果有可能不相关的更改导致它停止工作,并且用户需要了解它曾经是如何工作的。谢谢看起来不错!感谢您花时间改进您的答案:这不重要,但您可以在第二个解决方案中添加一个numbers.toArraynew字符串[0],以防OP需要数组结果。另外,在第三个解决方案中使用sc.hasNextInt和sc.nextInt可以直接生成列表,而不是列表List@Aaron是的,我可以这样做,但我不知道结果应该是String[]还是int[],所以我保持原样。
final String input = "1dsa23f hj23nma9123";
final String[] parts = input.split("[^0-9]+");
for (final String s: parts) {
    final int i = Integer.parseInt(s);
}