如何将字符串拆分为正整数和负整数?

时间:2017-02-18 06:21:40

标签: java string split

我正在编写一个程序,用矢量函数进行不同的计算,但我现在的程序界定了负数。我尝试过使用不同的分隔符,但我似乎无法找到合适的分隔符。

有人知道在拆分字符串时如何保留正数和负数?另外,有没有办法保留任何小数值? .45将返回45而.29将返回29

这是代码:

ArrayList<Integer> list = new ArrayList<Integer>();

String twoVectors = "a=<-1,2,-3> b=<4,-5,6>"; // vector and a and b

String[] tokens = twoVectors.split("\\D");

for (String s : tokens)
    if (!s.equals(""))
        list.add(Integer.parseInt(s));

System.out.println(Arrays.toString(list.toArray()));

当我运行程序时,我得到[1,2,3,4,5,6]而不是[-1,2,3,4,5,6]。我使用的所有功能都非常好,但在使用负值时不起作用。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

您可以使用

    String[] tokens = twoVectors.split("[^\\d-]+");

[^\\d-]+:匹配除数字和-

之外的任何内容

[]:匹配[]

中提到的所有内容

^:否定意味着不匹配(\\d-

\\d-:数字0-9-字符

Regex Demo

    String twoVectors = "a=<-1,2,-3> b=<4,-5,6>";

    ArrayList<Integer> list = new ArrayList<Integer>();

    String[] tokens = twoVectors.split("[^\\d-]");

    for (String s : tokens)
        if (!s.equals(""))
            list.add(Integer.parseInt(s));

    System.out.println(Arrays.toString(list.toArray()));

输出:

[-1, 2, -3, 4, -5, 6]

或者

您可以使用Patternmatcher来查找所有需要的值,即使用-?\\d+正则表达式

的有罪或无符号数字

Regex Demo -?\d+

更新:对于Double值,您可以使用[^\\d-.]+并确保使用Double代替Integer以及{{1} }}

Double.parseDoublePattern使用-?\\d*\\.?\\d+

答案 1 :(得分:1)

您当前使用的正则表达式将字符串拆分为任何位数。所以任何不是数字的东西都被认为是分裂者。如果您为此模式添加了-符号,则会包含任何非数字或-符号的内容。这适用于某些情况,但如果您-.之后没有数字,则会失败。

您需要做的是在正则表达式中指定数字格式(如-?\d*.?\d+),然后找到此模式的所有匹配项。您还需要将数字更改为Double,以便您可以解析十进制数字。

String twoVectors = "a=<-1,.2,-3> b=<4,-5,6>";

ArrayList<Double> numbers = new ArrayList<Double>();

Matcher matcher = Pattern.compile("-?\\d*\\.?\\d+").matcher(twoVectors);    
while (matcher.find()) {
   numbers.add(Double.parseDouble(matcher.group()));
}
System.out.println(Arrays.toString(numbers.toArray()));

输出

[-1.0, 0.2, -3.0, 4.0, -5.0, 6.0]

答案 2 :(得分:0)

在分割方法中使用[^\\d-],即twoVectors.split("[^\\d-]")

为什么[^\\d-]

  

^:查找必须在该行开头匹配的正则表达式。

     

\d:来自[0-9]

的任何数字      

-:匹配'-'(如果存在)

答案 3 :(得分:0)

1行解决方案:

List<Integer> numbers = Arrays
  .stream(twoVectors.replaceAll("^[^\\d-]+", "").split("[^\\d-]+"))
  .map(Integer::new)
  .collect(Collectors.toList());

初始替换是删除前导非目标字符(否则拆分将在第一个元素中返回空白)。