Java 字符串。匹配混乱

Java 字符串。匹配混乱,java,Java,所以我使用的是.matches方法,如下所示 desc.matches("[0-9a-z A-Z]+") 但每当我给它输入“100个图钉”时,它就会返回false。我不明白为什么 编辑: 所以我是一个新的发帖人,对此很抱歉,但我会用更好的描述来分享我的代码。因此,我正在扫描主类中的一个文件(“Inventory.txt”),该文件创建InventoryItem对象的名称和数组。我的问题是,当我调用.setDescription方法时,我一直得到参数异常 主要内容: InventoryI

所以我使用的是.matches方法,如下所示

    desc.matches("[0-9a-z A-Z]+")
但每当我给它输入“100个图钉”时,它就会返回false。我不明白为什么

编辑:

所以我是一个新的发帖人,对此很抱歉,但我会用更好的描述来分享我的代码。因此,我正在扫描主类中的一个文件(“Inventory.txt”),该文件创建InventoryItem对象的名称和数组。我的问题是,当我调用.setDescription方法时,我一直得到参数异常

主要内容:

InventoryItem类:

public class InventoryItem {
private String itemID = "0A";
private String description = "fill";
private double price = 0.0;

public InventoryItem()
{
   itemID = "TBD";
   description = "TBD";
   price = 0.0;
}
public InventoryItem(String itemID, String desc, double price)
{
   setDescription(desc);
   setItemID(itemID);
   setPrice(price);
}  

public void setItemID(String id)
{
   if(id.matches("[0-9a-zA-Z]+"))
   {
      itemID = id;
   }
   else
   {
      throw new IllegalArgumentException("ID must contain at least one letter or  one digit and only letters or digits");
   }
}

public void setDescription(String desc)
{
   if(desc.matches("[0-9a-z A-Z]+"))
   {
      description = desc;
   }
   else
   {
      throw new IllegalArgumentException("Description must contain letters");
   }
}

public void setPrice(double price)
{
   if(price < 0)
   {
      throw new IllegalArgumentException("Price must be non-negative");
   }
   else
   {
      this.price = price;
   }
}

public String getItemID()
{
   return itemID;
}

public String getDescription()
{
   return description;
}

public double getPrice()
{
   return price;
}
公共类清单项目{
私有字符串itemID=“0A”;
私有字符串description=“fill”;
私人双价=0.0;
公共清单项目()
{
itemID=“待定”;
description=“待定”;
价格=0.0;
}
公共库存项目(字符串itemID、字符串desc、双倍价格)
{
setDescription(描述);
setItemID(itemID);
设定价格(价格);
}  
公共void setItemID(字符串id)
{
if(id.matches(“[0-9a-zA-Z]+”)
{
itemID=id;
}
其他的
{
抛出新的IllegalArgumentException(“ID必须至少包含一个字母或一个数字,并且只能包含字母或数字”);
}
}
公共void setDescription(字符串描述)
{
如果(描述匹配(“[0-9a-z A-z]+”)
{
描述=描述;
}
其他的
{
抛出新的IllegalArgumentException(“说明必须包含字母”);
}
}
公共定价(双倍价格)
{
如果(价格<0)
{
抛出新的IllegalArgumentException(“价格必须为非负”);
}
其他的
{
这个价格=价格;
}
}
公共字符串getItemID()
{
返回itemID;
}
公共字符串getDescription()
{
返回说明;
}
公开双价
{
退货价格;
}
}

txt文件只包含以下内容:

111A

100个图钉

5.95

二十五


编辑:我想我找到问题了。在获取“description”时的txt文件中,有一个“-”,my.matches不允许使用该“-”。我的坏人,但谢谢你的帮助!lol

desc
一定不是您认为的那样(它不是“
100图钉”
”):

在使用
matches()检查
desc
之前,请尝试
System.out.println(desc)甚至:

for(char c : desc.toCharArray()) {
    System.out.println(c + " - ASCII code: " + (int) c);
}
它将为您提供分配给
desc
字符串中使用的字符的所有ASCII代码的列表-您可以检查此列表是否包含以下字符类中未包含的字符:
[0-9a-z a-z]
。要查看ASCII码列表,您可以在Internet上搜索,例如

  • 0到9之间的数字具有48到57之间的ASCII码

  • 从a到z的字符:从97到122

  • 从A到Z的字符:65到90,可能是这里最重要的字符:

  • 空格:32


  • 如果在我前面显示的使用for循环打印的列表中,有任何ASCII代码未在此处列出,
    String.matches()
    返回
    false
    。(感谢戴夫·汤普森的宝贵建议)。

    你做错了什么<代码>System.out.println(“100个图钉”匹配(“[0-9a-z A-z]+”))打印
    true
    。为我返回
    true
    。这为我返回true。一些错误的字符在打印时可能不可见,如CR、NBSP、软连字符、(冗余)从左到右、(非标准)BOM,或者至少不容易看到,如西里尔字母。@dave_thompson_085当然你是对的。我编辑了我的答案,如果你能说一句话,如果这种检查ASCII码在OP的情况下是可以接受的,如果它能帮助发现
    String.matches()
    返回
    false
    的问题,我将不胜感激。谢谢你的解释。
    String desc = "100 Thumbtacks";
    System.out.println(desc.matches("[0-9a-z A-Z]+")); // prints "true"
    
    for(char c : desc.toCharArray()) {
        System.out.println(c + " - ASCII code: " + (int) c);
    }