弄清楚并检查这个模式

时间:2011-10-08 15:45:01

标签: java regex

所以我希望我的输入成为以下之一:

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])

此代码模式是冗余的,不可行的还是错误的?它实际上会做我想做的事吗?我通常只是运行它来测试它,但是用我的应用程序来利用和测试代码需要一段时间。

4 个答案:

答案 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]

以上正则表达式将匹配999919009,但不匹配12349999

如果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());
}