gpt4 book ai didi

java - 包含分号分隔范围的字符串的正则表达式,例如 "3-5;9-13;15;20-49"(java)

转载 作者:行者123 更新时间:2023-12-02 06:21:14 24 4
gpt4 key购买 nike

祝大家新年快乐,

我有一个像“3-5;9-13;15;20-49”这样的字符串。我想使用正则表达式来:

首先,尽可能检查语法是否正确...含义:范围由分号分隔,范围由 x-y 或仅 x 定义(其中x 和 y 是小数)(范围的顺序或 x

我认为我的正则表达式中一定有一些错误,因为 matches() 虽然给出了 false该字符串在语法上是正确的,并且 find()group() 给我给定的范围...?如果我稍微改变正则表达式...我会得到 matches() 返回 true,但我无法得到使用 find()group() 进行“范围”。

我做错了什么?

问候,伊夫

代码:

    import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RangeRegEx {


public static void main(String[] args) {


String rangeExample = "1-5;7;12-22;50-56;60-90;95;";

String rangeRegEx = "(\\d+(-\\d+)?)"; // matches returnes false, but find() and group() return correct groups

System.out.println ("Variant 1 \""+printRegEx(rangeRegEx)+"\":\n--------------------\n");

Pattern mrPattern = Pattern.compile(rangeRegEx);

Matcher m = mrPattern.matcher(rangeExample);

System.out.println ("RegEx matches() -> "+m.matches());
m.reset();

while (m.find()) {
System.out.println(m.group());
}


rangeRegEx = "((\\d+)(-\\d+)?(;)?)+"; // matches() returns true, but find() and group() do not work...

System.out.println ("\n\nVariant 2 \""+printRegEx(rangeRegEx)+"\":\n--------------------\n");

mrPattern = Pattern.compile(rangeRegEx);

m = mrPattern.matcher(rangeExample);

System.out.println ("RegEx matches() -> "+m.matches());
m.reset();

while (m.find()) {
System.out.println(m.group());
}



}

public static String printRegEx(String regEx){
StringBuffer s=new StringBuffer();
for (int c=0;c<regEx.length();c++){
char ch=regEx.charAt(c);
s.append(ch);
if (ch == '\\') s.append("\\");
}
return s.toString();
}
}

运行上面给出的代码会将以下消息打印到控制台:

    Variant 1 "(\\d+(-\\d+)?)":
--------------------

RegEx matches() -> false
1-5
7
12-22
50-56
60-90
95


Variant 2 "((\\d+)(-\\d+)?(;)?)+":
--------------------

RegEx matches() -> true
1-5;7;12-22;50-56;60-90;95;

最佳答案

试试这个。

(\\d+-\\d+|\\d+)(;(\\d+-\\d+|\\d+))*;?

这定义了以下内容:
1) 范围可以是数字数字-数字
2) 数字是任意数字序列
3) 您有 >= 1 个范围,每两个连续的范围恰好由一个 ;
分隔4) 末尾可能有,也可能没有 ;

请注意,0010-0001 也将被我的正则表达式视为有效范围。

根据您下面的评论:这就是您想要实现的目标。为此,您需要另一个/更简单的正则表达式。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RangeRegEx {

public static void main(String[] args) {

String rangeExample = "1-5;7;12-22;50-56;60-90;95";

String rangeRegEx = "(\\d+-\\d+|\\d+)";

Pattern mrPattern = Pattern.compile(rangeRegEx);

Matcher m = mrPattern.matcher(rangeExample);

while (m.find()) {
System.out.println(m.group(1));
System.out.println("===");
}
}

}

另一个例子。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RangeRegEx {

public static void main(String[] args) {

String rangeExample = "1-5;7;12-22;50-56;60-90;95;";

String rangeRegEx = "(\\d+-\\d+|\\d+);(\\d+-\\d+|\\d+);(\\d+-\\d+|\\d+);(\\d+-\\d+|\\d+);(\\d+-\\d+|\\d+);(\\d+-\\d+|\\d+);";

Pattern mrPattern = Pattern.compile(rangeRegEx);

Matcher m = mrPattern.matcher(rangeExample);
System.out.println(m.matches());
m.reset();

while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
System.out.println(m.group(4));
System.out.println(m.group(5));
System.out.println(m.group(6));
}
}

}

关于java - 包含分号分隔范围的字符串的正则表达式,例如 "3-5;9-13;15;20-49"(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20995523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com