我要求用户通过Java中的Scanner
输入,现在我想使用正则表达式解析他们的选择。本质上,我向他们展示了一个列举的项目列表,他们输入了他们想要选择的项目的数字,用空格分隔。这是一个例子:
1 yorkshire terrier
2 staffordshire terrier
3 goldfish
4 basset hound
5 hippopotamus
Type the numbers that correspond to the words you wish to exclude: 3 5
列举的项目列表可以只是几个元素或几百个。我使用的当前正则表达式看起来像^|\\.\\s+)\\d+\\s+
,但我知道这是错误的。我还没有完全理解正则表达式,所以如果你能解释它正在做什么也会有所帮助!
答案 0 :(得分:4)
Pattern pattern = new Pattern(^([0-9]*\s+)*[0-9]*$)
RegEx的解释:
这会将以下所有输入视为有效:
等
答案 1 :(得分:2)
你想要整数:
\d+
后跟任意数量的空格,然后是另一个整数:
\d+( \d+)*
请注意,如果要在Java字符串中使用正则表达式,则需要将每个\
转义为\\
。
答案 2 :(得分:0)
要“解析”整数,您不一定要匹配输入,而是要将其拆分为空格(使用正则表达式):
String[] nums = input.trim().split("\\s+");
如果您确实需要int
值:
List<Integer> selections = new ArrayList<>();
for (String num : input.trim().split("\\s+"))
selections.add(Integer.parseInt(num));
答案 3 :(得分:0)
如果要确保字符串仅包含数字和空格(允许可变数量的空格和尾随/前导空格)并同时提取数字,可以使用\G
锚点查找连续比赛。
String source = "1 3 5 8";
List<String> result = new ArrayList<String>();
Pattern p = Pattern.compile("\\G *(\\d++) *(?=[\\d ]*$)");
Matcher m = p.matcher(source);
while (m.find()) {
result.add(m.group(1));
}
for (int i=0;i<result.size();i++) {
System.out.println(result.get(i));
}
注意:在全局搜索开始时,\G
匹配字符串的开头。