我正在编写一个用于匹配特定模式的正则表达式,如下所示。
我们都熟悉通过word文档打印选择页面时提供的模式。即。
有效值:
1, 3, 6-9
1-5, 5
6, 9
无效值
,5
5-,9
9-5,
2,6-
我一直在使用模式(([0-9]+)|(\\d.*[-,]\\d.*)+)
,但它并不适用于所有排列组合。
非常感谢任何帮助!
答案 0 :(得分:4)
答案 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 +)?)* $
致谢!