这是我的程序,如果我的输入是这样的,那就是它的工作:
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);
}
}
答案 0 :(得分:4)
[^0-9-]+
是一个character class,可以捕获所有连续的(下一个)其他数字或破折号字符。这就是为什么-123-124
被视为一个你不想要的单位。
此上下文中的正数表示
一个数字,它是字符串中的第一个字符,或者是第一个紧跟非字母/非破折号字符的数字。
这个正则表达式将提取所有正数:
(?:^|(?<![-0-9]))([0-9]+)
它表示数字前面的位置必须是beginning of the string (^
) ... or (|
)包含短划线或数字以外的任何字符((?<![-0-9])
)。后者是negative look-behind。
此上下文中的负数表示
所做的数字之前有一个破折号,因此不是字符串中的第一个字符。
此正则表达式将提取所有负数:
(-[0-9]+)
它说“找到一个破折号,紧接着是一个或多个数字”。
如果你没有有在单个正则表达式中进行解析,请不要。为什么要让它变得比它需要的更复杂?分两次分析字符串。首先提取正数,然后提取负数,然后按照你的意愿去做。
请考虑将Stack Overflow Regular Expressions FAQ加入书签以供将来参考。
答案 1 :(得分:0)