用于解析两个实数范围的捕获组的正则表达式
Regular expression with captured groups for parsing a range of two real numbers
我需要一个正则表达式来正确解析两个实数(无符号)的范围,用连字符表示。
有效输入:
1-3
3.14-7.50
0-4.01
Android Java。
我目前的做法:
Pattern pattern = Pattern.compile("(?<Minimum>\d+(\.\d+))-(?<Maximum>\d+(\.\d+))");
Matcher matcher = pattern.matcher("3.14-5.2");
String min = matcher.group("Minimum");
String max = matcher.group("Maximum");
它在尝试检索最小值时崩溃。
java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.getMatchedGroupIndex(Matcher.java:1314)
at java.util.regex.Matcher.group(Matcher.java:572)
我真的看不出这个表达有什么问题。
我特别希望能解释一下它的问题所在。允许在连字符周围使用可选的白色 space 的正则表达式也会非常好(我希望它能那样工作,但我暂时放弃了它,因为我根本无法让它工作)。
您需要将小数部分设为可选:
Pattern pattern = Pattern.compile(
"(?<Minimum>\d+(?:\.\d+)?)-(?<Maximum>\d+(?:\.\d+)?)");
在 (?:\.\d+)
之后的 ?
将使该组成为可选匹配项
- 最好使用
?:
使其成为非捕获组
另外你需要在调用.group(int)
方法之前调用matcher.find()
或matcher.matches()
。
我需要一个正则表达式来正确解析两个实数(无符号)的范围,用连字符表示。
有效输入:
1-3
3.14-7.50
0-4.01
Android Java。
我目前的做法:
Pattern pattern = Pattern.compile("(?<Minimum>\d+(\.\d+))-(?<Maximum>\d+(\.\d+))");
Matcher matcher = pattern.matcher("3.14-5.2");
String min = matcher.group("Minimum");
String max = matcher.group("Maximum");
它在尝试检索最小值时崩溃。
java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.getMatchedGroupIndex(Matcher.java:1314)
at java.util.regex.Matcher.group(Matcher.java:572)
我真的看不出这个表达有什么问题。
我特别希望能解释一下它的问题所在。允许在连字符周围使用可选的白色 space 的正则表达式也会非常好(我希望它能那样工作,但我暂时放弃了它,因为我根本无法让它工作)。
您需要将小数部分设为可选:
Pattern pattern = Pattern.compile(
"(?<Minimum>\d+(?:\.\d+)?)-(?<Maximum>\d+(?:\.\d+)?)");
-
在
?
将使该组成为可选匹配项- 最好使用
?:
使其成为非捕获组
(?:\.\d+)
之后的 另外你需要在调用.group(int)
方法之前调用matcher.find()
或matcher.matches()
。