我可以检查String以查找特定字符以外的字符吗?

时间:2018-03-21 00:54:59

标签: java string-comparison roman-numerals

我正在编写一个Java程序,可以将输入的罗马数字转换为Short,我希望它能够识别并在输入除罗马数字(I,V,X)之外的任何字母时再次输入输入,L,C,D和M)。

是否有类似.contains()的方法,但功能相反?
或者我是否必须通过某种循环检查每个字母?

3 个答案:

答案 0 :(得分:1)

我建议你使用正则表达式来检查输入是否是罗马数字。您可以找到此问题的正则表达式here。使用String#matches()确定您的输入是否与正则表达式匹配。

if(!input.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$")) { // input is the String the user entered
    // handle invalid input here
}

答案 1 :(得分:1)

当然,你需要某种类型的过滤器来测试输入。

一种解决方案可能是使用包含输入中所有可能有效字符的字符串,如果在过滤器中找不到字符则返回false。

public class HelloWorld
{
  public static boolean filter(String test, String filter) {
    for(int i = 0; i < test.length(); i++) {
        if (filter.indexOf(test.charAt(i)) == -1) {
            return false;
        }
    }
    return true;
  }
  // arguments are passed using the text field below this editor
  public static void main(String[] args)
  {
    System.out.println(filter("XDQX", "XDQ"));
  }
}

答案 2 :(得分:0)

只需测试有效字符,而不是有效序列,可以使用contains:

进行测试
boolean roman (String s) 
{
    for (char c: s.toCharArray()) 
        if (! "IVXCLDM".contains(""+c)) 
            return false; 
    return true; 
}

但是,我更喜欢正则表达式

boolean roman (String s) 
{
    return s.matches ("[IVXCLDM]+");
}

表示该Set中任意数量(+)的字符,至少一个。