我正在编写一个正则表达式,用于匹配特定的模式,如下所示。
我们都很熟悉通过word文档打印选择性页面时给出的模式。即
有效值:
1, 3, 6-9
1-5, 5
6, 9
无效值:
,5
5-,9
9-5,
2,6-
我一直在使用模式(([0-9]+)|(\\d.*[-,]\\d.*)+)
,但它并不适用于所有置换组合。
任何帮助都将不胜感激!
发布于 2014-09-19 09:50:14
您可以在Java中使用此正则表达式:
^\d+(?:-\d+)?(?:,\h*\d+(?:-\d+)?)*$
RegEx详细信息:
^
:开始\d+(?:-\d+)?
:可选地匹配1+数字,后面跟着连字符和1+数字(?:
:启动非捕获组,
:匹配逗号\h*
:匹配0或更多空白空间\d+(?:-\d+)?
:可选地匹配1+数字,后面跟着连字符和1+数字)*
:结束非捕获组。*
重复此组0次或多次。$
:结束发布于 2014-09-19 09:59:41
下面的正则表达式将验证它是一个逗号分隔的正自然数列表或数字范围(由两个由-
分隔的正数组成):
^\d+(-\d+)?(?:,\d+(?:-\d+)?)*+$
在字符串文字中:
"^\\d+(-\\d+)?(?:,\\d+(?:-\\d+)?)*+$"
如果您想知道*+
,它是通常的0或更多量词*
的占有式版本。基本上,它减少了回溯。这种语法在Java和PCRE中是可用的,但是对于没有支持的语言,可以将+
放在*+
中。
发布于 2018-02-10 11:34:03
这是我库中的一个类,它接受像"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;
}
}
}
https://stackoverflow.com/questions/25931053
复制相似问题