【问题标题】:why regex [^-?0-9]+ ignores '?'? [duplicate]为什么正则表达式 [^-?0-9]+ 忽略“?”? [复制]
【发布时间】:2020-06-16 02:26:44
【问题描述】:

我正在尝试排除可能为负数的字符串整数。 我试过这个:

String numbersExcluded=input.replaceAll("[^-?0-9]+"," ");
String[] stringOfNumbers=numbersExcluded.trim().split(" ");

for (String each:stringOfNumbers)
     System.out.println(each);

但是当我输入像“aaa-4aaa5aaa?”这样的输入时,就会出现这种情况。打印循环,打印

-4
5
?

为什么包含??我该如何解决这个问题?

【问题讨论】:

  • 你在否定字符类中有?,所以它显然会跳过?
  • 您的字符串显示“用空格替换不是减号、问号或数字的内容”。问号在您的排除列表中。
  • @RealSkeptic 我的意思是“一次或从不”发生?标志 。那么有什么替代方案呢?
  • 在字符类中,? 没有这个含义。我认为更清晰的选择是不使用拆分,而是使用 Matcherfind 的循环。
  • @chuck2002 它还允许像--- 这样的字符串。我认为 OP 只想保留以可选减号开头的字符串,后跟数字。

标签: java regex


【解决方案1】:

我认为 replaceAll 在这里不是正确的选择,我建议使用:

Pattern pattern = Pattern.compile("-?\\d+");
Matcher matcher = pattern.matcher("aaa-4aaa5aaa?");
List<Integer> result = new ArrayList<>();
while (matcher.find()) {
    result.add(Integer.parseInt(matcher.group()));
}

或者从 Java-9+ 你可以使用:

List<Integer> result = Pattern.compile("-?\\d+")
        .matcher("aaa-4aaa5aaa?")
        .results()
        .map(MatchResult::group)
        .map(Integer::valueOf)
        .collect(Collectors.toList());

输出

[-4, 5]

【讨论】:

  • 这将删除所有非数字,无论前面是否带有-。 OP 希望保留所有带有或不带有- 的号码。
  • 我建议保留 [0-9] 类而不是 \d,因为后者匹配 Unicode 认为是数字的任何内容,其中大部分对 Integer.parseInt 无效。
  • 我同意@kaya3,但为了最大程度的安全性,我喜欢 \d,因为它简单明了。
  • 不确定您所说的安全性是什么意思;允许用户引发NumberFormatException 被抛出当然不能提高您的应用程序的安全性,但如果您希望操作始终成功完成,则可能会降低它的安全性。
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多