无法让java匹配正则表达式匹配()

时间:2014-10-19 09:36:57

标签: java regex

我有一个问题,我正在尝试获取一个参数来匹配格式'Uddd',其中'U'必须是字母U,'ddd'可以是0-9之间的任何3位数。

我目前的代码:

//borrow method
public boolean borrow(String borrowerID) 
{
    //if the borrower ID matches the format 'Uddd'
    if (borrowerID.matches("U([0-9]{3})"))
    {
       //if the status is available
       if (status == 'A')
       {
          this.borrowerID = borrowerID;
          this.status = 'O';
          this.dateBorrowed = currentDate;
          return true;
       }
       //is not available
       else
       {
          return false;
       }
    }
    //does not match format
    else
    {
       return false;
    }
}

由于某种原因,它没有正确验证。当我尝试输入'1'作为参数时,它仍然返回true。

我有什么遗失的吗?

4 个答案:

答案 0 :(得分:4)

如果输入为true,则该方法不可能返回"1"。我只能建议您确保 传递"1"并且该方法是被调用的方法。

可以通过顶部的简单调试语句来完成,例如:

System.out.println ("Calling correct function with [" + borrowerId + "]");

在功能开始时。

我还建议进行一些清理工作,使函数更容易编码和读取,如下所示:

// borrow method
public boolean borrow(String borrowerID) 
{
    // Temp debug statement.

    // System.out.println ("borrow [" + borrowerId + "]");

    // "Not available" or "invalid borrower" means reject request.

    if (status != 'A')
        return false;

    if (! borrowerID.matches("U([0-9]{3})"))
        return false;

    // Okay to borrow.

    this.borrowerID = borrowerID;
    this.status = 'O';
    this.dateBorrowed = currentDate;

    return true;
}

这比所有return-else-do-something构造要清晰得多,它遵循"快速失败"范例

有些人往往不喜欢多个回归点,但这通常是因为他们不理解为什么他们被认为是坏的(意大利面条代码)。使用这样的短函数,它不会造成问题。

答案 1 :(得分:2)

我的正则表达式取得了良好的效果:" 1" - > false," UU123" - >假," U1234" - >假," U132" - >真。

但您可以使用\ d而不是[0-9]:

 borrowerID.matches("U(\\d{3})")

答案 2 :(得分:1)

实际上这是不可能的。当输入1时它不会返回true而是返回false。可能是你的状态等于'A'应该是返回true的理由

String borrowerID="1";    
boolean matches = borrowerID.matches("U([0-9]{3})");
System.out.println(matches);

输出>>

false

如果你只是想找到正则表达式匹配或者不使用这个。或者把一个sout并检查状态值。确定它应该是A

if (borrowerID.matches("U([0-9]{3})")) {

  return true;

} else {

  return false;
}

答案 3 :(得分:0)

regex

没有问题
System.out.println("U888".matches("U([0-9]{3})"));

输出true

System.out.println("1".matches("U([0-9]{3})"));

输出false

尝试debug您的代码,breakpoint

borrow function if (borrowerID.matches("U([0-9]{3})") && (status == 'A')) { this.borrowerID = borrowerID; this.status = 'O'; this.dateBorrowed = currentDate; return true; } else { return false; }

您还可以优化您的喜欢

status

我不理解正在行动,你正在检查{{1}}再次发现' A'并在内部分配' 0',它有意义吗?(无论如何它取决于你)