【问题标题】:How to check if only certain characters appear in a String? [duplicate]如何检查字符串中是否只有某些字符? [复制]
【发布时间】:2014-10-06 14:51:59
【问题描述】:

我需要用户输入十六进制数字,只要他们的输入包含字符 A-F0-9,它就不会重新提示他们。

这就是我所拥有的,只要输入的字符串包含 A-F 和或 0-9,它仍然会运行,如果您添加其他我不想要的字符。

do {
    System.out.print("Enter a # in hex: ");
    inputHexNum = keyboard.next();      
} while(!(inputHexNum.toUpperCase().matches(".*[A-F0-9].*")));

【问题讨论】:

  • 所以你的输入只有两位数?喜欢FFB3

标签: java regex methods


【解决方案1】:

你能不能把你的正则表达式改成[A-F0-9]+

所以您的代码如下所示:

do {
    System.out.print("Enter a # in hex: ");
    inputHexNum = keyboard.next();
} while(!(inputHexNum.toUpperCase().matches("[A-F0-9]+")));

据我了解,您当前的正则表达式的问题在于它允许任何字符出现零次或多次,然后是十六进制字符,然后是任何旧字符再次出现零次或多次。这将整个输入限制为仅包含至少一个由字母 A-F(大写)和数字 0-9 组成的字符。

【讨论】:

  • 那么它也会匹配4353BB3343543533123434A3A4C3
  • 我的理解是这就是想要匹配的内容。我很可能误解了这个问题......
  • 我给出了相同的答案(并删除了它)。让我们只希望OP快速响应。
【解决方案2】:

您的正则表达式可能无法满足您的要求。 .* 完全匹配任何内容(空字符串,最多可包含任意数量的任意字符)。然后你期望一个十六进制字符后跟任何内容。

所以这些将是有效的输入:

--0--
a
JFK

你应该说“我想要一个只包含有效十六进制数字的字符串。那么你的条件是:

while(!(inputHexNum.toUpperCase().matches("[A-F0-9]+")));

或者您可以使用[^A-F0-9] 模式检查任何非法字符。在这种情况下,您需要自己创建一个Matcher

Pattern illegalCharacters = Pattern.compile("[^A-F0-9]");
Matcher matcher;
do {
    ...
    matcher = illegalCharacters.matches(inputHexNum.toUpperCase());
} while( matcher.find() );

【讨论】:

    【解决方案3】:

    您使用的正则表达式匹配每个至少包含一个十六进制数字的字符串。从问题的第一段来看,这正是您想要的。这是因为"." 匹配任何字符(但可能不匹配换行符),所以".*" 匹配任何(可能为空的)字符序列。因此,正则表达式".*[A-F0-9].*" 的意思是“首先是一些任意字符,然后是十六进制数字,然后是更多字符”。但是从问题的第二段来看,您似乎想使用正则表达式"[A-F0-9]+",这意味着“一些十六进制数字(但至少一个,仅此而已)”。我假设您对需要做什么感到困惑,但实际上想要第二个。

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 2019-12-29
      • 2010-11-22
      • 2011-03-31
      • 1970-01-01
      • 2016-08-09
      • 2016-08-21
      • 2014-05-07
      相关资源
      最近更新 更多