所以我希望我的输入成为以下之一:
0 =任何整数
0,00, 000,0:0,00:0, 000:0
基本上是0-999,接着是一个可选的冒号和0-9。我正在使用的模式是
([0-9]|([0-9][0-9])|([0-9][0-9][0-9]))|(([0-9]|([0-9][0-9])|([0-9][0-9][0-9]))&&\3A&&[0-9])
此代码模式是冗余的,不可行的还是错误的?它实际上会做我想做的事吗?我通常只是运行它来测试它,但是用我的应用程序来利用和测试代码需要一段时间。
答案 0 :(得分:2)
仔细观察:
&&
不是特殊字符,必须按字面匹配。因此,RE的这部分将永远不会与您的示例匹配。\3A
应为\\x3A
。否则,它将匹配字符与代码3,后跟“A”。使用重复量词{n,m}
代替多个|
更容易阅读和理解
Pattern p = Pattern.compile("\\d{1,3}|\\d{1,3}:\\d");
答案 1 :(得分:0)
首先,您需要设计一个正则表达式来匹配0到999之间的每个数字。假设009是一个有效数字,您基本上可以匹配三个数字序列([0-9]
),并使前两个可选:
[0-9]?[0-9]?[0-9]
以上正则表达式将匹配999
,9
,19
,009
,但不匹配1234
或9999
。
如果009
不是有效数字,那么您需要从上面的前两个组中排除0
,产生:
([1-9][0-9]|[1-9])?[0-9]
也就是说,如果你有一个百位数,那么它不能是0([1-9]
),如果你有一个十位数(但不是一个数百位),那么它也必须不是0(正则表达式中的第二个[1-9]
。
最后,你需要包含可选部分,它基本上是一个数字后面的逗号,产生最终表达式:
([1-9][0-9]|[1-9])?[0-9](:[0-9])?
然后,您可以使用简单的独立程序运行一些简单的测试:
public static void main(String... args) {
Pattern p = Pattern.compile("(?:[1-9][0-9]|[1-9])?[0-9](?::[0-9])?");
System.out.println(p.matcher("999").matches());
System.out.println(p.matcher("1234").matches());
System.out.println(p.matcher("9").matches());
System.out.println(p.matcher("19").matches());
System.out.println(p.matcher("999:9").matches());
System.out.println(p.matcher("12:99").matches());
}
答案 2 :(得分:0)
试试这个:
try {
Pattern regex = Pattern.compile("\\d{1,3}(?::\\d)?");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
// matched text: regexMatcher.group()
// match start: regexMatcher.start()
// match end: regexMatcher.end()
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
它应该让你去。
答案 3 :(得分:0)
这是一个工作模式并使用JUnit,您可以使用一些示例数据对其进行测试。此代码是预期的输入验证 - 因此,如果您尝试从字符串中提取这些值,那么这是一个不同的模式,需要进行不同的测试。
Pattern pattern = Pattern.compile("^\\d{1,3}(?::\\d)?$");
List<String> samples = Arrays.asList("0", "00", "000", "0:0", "00:0", "000:0");
List<String> failSamples = Arrays.asList("0000", "0000:0", "0:00", "00:00", "000:00");
for (String sample : samples)
{
assertTrue(sample, pattern.matcher(sample).matches());
}
for (String failSample : failSamples)
{
assertFalse(failSample, pattern.matcher(failSample).matches());
}