首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证页码/范围以供打印

验证页码/范围以供打印
EN

Stack Overflow用户
提问于 2014-09-19 09:48:03
回答 7查看 3.1K关注 0票数 5

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

我们都很熟悉通过word文档打印选择性页面时给出的模式。即

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

有效值:

代码语言:javascript
运行
复制
1, 3, 6-9
1-5, 5
6, 9

无效值:

代码语言:javascript
运行
复制
,5
5-,9
9-5,
2,6-

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

任何帮助都将不胜感激!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-09-19 09:50:14

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

代码语言:javascript
运行
复制
^\d+(?:-\d+)?(?:,\h*\d+(?:-\d+)?)*$

RegEx演示

RegEx详细信息:

  • ^:开始
  • \d+(?:-\d+)?:可选地匹配1+数字,后面跟着连字符和1+数字
  • (?::启动非捕获组
    • ,:匹配逗号
    • \h*:匹配0或更多空白空间
    • \d+(?:-\d+)?:可选地匹配1+数字,后面跟着连字符和1+数字

  • )*:结束非捕获组。*重复此组0次或多次。
  • $:结束
票数 6
EN

Stack Overflow用户

发布于 2014-09-19 09:59:41

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

代码语言:javascript
运行
复制
^\d+(-\d+)?(?:,\d+(?:-\d+)?)*+$

在字符串文字中:

代码语言:javascript
运行
复制
"^\\d+(-\\d+)?(?:,\\d+(?:-\\d+)?)*+$"

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

票数 5
EN

Stack Overflow用户

发布于 2018-02-10 11:34:03

这是我库中的一个类,它接受像"1,2,3-6,4-5“这样的参数,输出一个不同整数的列表,1,2,3,4,5,6。

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25931053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档