Java正则表达式用于从字符串中分割负数和正数

时间:2015-03-24 15:00:18

标签: java regex

这是我的程序,如果我的输入是这样的,那就是它的工作: asd12jjh-23lm100k但如果我一个接一个地有两个负数 asd123kk-23-51llk表达式regex不起作用。所以我需要帮助如何更改我的表达式以使用-符号从字符串中获取所有数字,然后打印它们并计算所有元素的总和。

import java.util.Scanner;
public class Task9 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a string with digits,characters and sign");
    String sentecen = sc.nextLine();
    int sum = 0;
    String []splitedNumbers = sentecen.split("[^0-9-]+");
    for (int i = 1; i < splitedNumbers.length; i++) {
    sum+=Integer.parseInt(splitedNumbers[i]);   
    }
    for(String check:splitedNumbers){
        System.out.println(check);
    }
    System.out.println(sum);
}

}

2 个答案:

答案 0 :(得分:4)

[^0-9-]+

是一个character class,可以捕获所有连续的(下一个)其他数字或破折号字符。这就是为什么-123-124被视为一个你不想要的单位。

此上下文中的正数表示

  

一个数字,它是字符串中的第一个字符,或者是第一个紧跟非字母/非破折号字符的数字。

这个正则表达式将提取所有正数:

(?:^|(?<![-0-9]))([0-9]+)

Regular expression visualization

Debuggex Demo

它表示数字前面的位置必须是beginning of the string (^) ... or (|)包含短划线或数字以外的任何字符((?<![-0-9]) )。后者是negative look-behind

此上下文中的负数表示

  

所做的数字之前有一个破折号,因此不是字符串中的第一个字符。

此正则表达式将提取所有负数:

(-[0-9]+)

Regular expression visualization

Debuggex Demo

它说“找到一个破折号,紧接着是一个或多个数字”。


如果你没有在单个正则表达式中进行解析,请不要。为什么要让它变得比它需要的更复杂?分两次分析字符串。首先提取正数,然后提取负数,然后按照你的意愿去做。


请考虑将Stack Overflow Regular Expressions FAQ加入书签以供将来参考。

答案 1 :(得分:0)

您可以在this site;

测试正则表达式

您可以使用正则表达式"[0-9]+|[-][0-9]+"检索所有数字,然后进行总和。

您可以找到正则表达式模式here