验证打印的页码/范围

时间:2014-09-19 09:48:03

标签: java regex

我正在编写一个用于匹配特定模式的正则表达式,如下所示。

我们都熟悉通过word文档打印选择页面时提供的模式。即。

  • 我们可以使用逗号和连字符
  • 不允许其他特殊字符
  • 应以数字开头和结尾
  • 逗号和连字符不允许在一起等

有效值:

1, 3, 6-9
1-5, 5
6, 9

无效值

,5
5-,9
9-5,
2,6-

我一直在使用模式(([0-9]+)|(\\d.*[-,]\\d.*)+),但它并不适用于所有排列组合。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:4)

您可以在Java中使用此正则表达式:

^(?!([ \d]*-){2})\d+(?: *[-,] *\d+)*$

RegEx Demo

答案 1 :(得分:3)

以下正则表达式将验证它是逗号分隔的正数自然数或数字范围列表(由-分隔的2个正自然数组成):

^\d+(-\d+)?(?:,\d+(?:-\d+)?)*+$

字符串文字:

"^\\d+(-\\d+)?(?:,\\d+(?:-\\d+)?)*+$"

如果您想知道*+,那么它是通常的0或更多量词*所有格版本。基本上,它减少了回溯。此语法在Java和PCRE中可用,但对于没有支持的语言,请将+放在*+中。

答案 2 :(得分:1)

有点晚了但是我最近重写了我的图书馆的课程。将采取像" 1,2,3-6,4-5"并输出不同整数的列表[1,2,3,4,5,6]。现在会有一些开源库为你做这件事...虽然因为我已经有了一个好的课程,所以并没有看得太多。

package se.imagick.scrap;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class RangeParser {

    public static void main(String[] args) {
        String ranges = "1,2,3-6,4-5";
        List<Integer> rangeList = getDistinctNumbers(ranges);
        System.out.println(rangeList);
    }

    public static List<Integer> getDistinctNumbers(String ranges) {

        return Arrays.stream(ranges.split(","))
                .map(s -> s.replace(" ", ""))
                .map(Range::new)
                .flatMap(range -> range.render().stream())
                .distinct()
                .sorted()
                .collect(Collectors.toList());
    }

    private static class Range {
        private int start;
        private int stop;

        public Range(String rangeStr) {
            String[] rangeArray = rangeStr.split("-");
            int length = rangeArray.length;

            if (length < 1 || length > 2) {
                throw new IllegalArgumentException("Wrong number of arguments in a Range: " + length);
            }

            start = Integer.parseInt(rangeArray[0]);
            stop = (length == 1) ? start : Integer.parseInt(rangeArray[1]);

            if (stop < start) {
                throw new IllegalArgumentException("Stop before start!");
            }
        }

        public List<Integer> render() {
            List<Integer> pageList = new ArrayList<>(stop - start + 1);
            for (Integer i = start; i < stop + 1; i++) {
                pageList.add(i);
            }

            return pageList;
        }
    }
}

答案 3 :(得分:0)

为避免 char 输入错误,请将其放置在“列表”之前:

ranges = ranges.replaceAll("[a-zA-Z.]", "");
List<Integer>...

答案 4 :(得分:0)

哇! 我的第一个正则表达式!

我认为这允许在数字前加空格...

^ \ s?\ d +(-\ d +)?(?:,\ s?\ d +(?:-\ d +)?)* $

致谢!