正则表达式匹配整数然后空间的连续模式

时间:2014-04-15 16:24:09

标签: java regex

我要求用户通过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+,但我知道这是错误的。我还没有完全理解正则表达式,所以如果你能解释它正在做什么也会有所帮助!

4 个答案:

答案 0 :(得分:4)

Pattern pattern = new Pattern(^([0-9]*\s+)*[0-9]*$)

RegEx的解释:

  • ^:输入的开头
  • [0-9]:仅限数字
  • ' *' :任意位数
  • \ s:空格
  • ' +' :至少一个空间
  • '()*' :任意数量的此数字空间组合
  • $:输入结束

这会将以下所有输入视为有效:

  • " 1"
  • " 123 22"
  • " 123 23"
  • " 123456 33 333 3333"
  • " 12321 44 452 23"

答案 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匹配字符串的开头。