是否可以检查字符是否与可能性列表匹配?

Posted

技术标签:

【中文标题】是否可以检查字符是否与可能性列表匹配?【英文标题】:is it possible to check if a char matches a list of possibilities? 【发布时间】:2015-02-17 18:57:52 【问题描述】:

例如我知道在检查字符串时,你可以这样做

if (string.matches("a|e|i|o|u|A|E|I|O|U" ) )

   // Then do this code.

但是有没有办法检查一个字符是否匹配一个可能性列表? 还是我要一一检查,比如

if(char == a || char == e || char == i )

...等等。

【问题讨论】:

您是否收到了某些特定数据结构中的字符列表?否则,如果可以的话,我会选择@rgettman 的答案,其中 -1 表示在字符串中找不到字符。 仅供参考,如果你想匹配正则表达式中的一组字符,有一个特殊的符号:string.matches("[aeiouAEIOU]"),它比 "a|e|i|o|u|A|E|I|O|U" 更方便、更容易阅读。 【参考方案1】:

String 中查找char 时,您可以执行类似的操作,方法是使用indexOf method 搜索字符串。

if ("aeiouAEIOU".indexOf(aChar) != -1)

【讨论】:

【参考方案2】:

从性能的角度来看,最佳方法是这样的:

private final BitSet matchChars = matchChars();

private BitSet matchChars() 
  final BitSet bs = new BitSet();
  final String matchString = "aeiouAEIOU";
  for (int i = 0; i < matchString.length(); i++)
     bs.set(matchString.charAt(i));
  return bs;


public boolean charMatches(char c)  return matchChars.get(c); 

即使您使用 char 类型提供的整个 16 位范围,该方法所需的内存也非常少:最多 8 KB。

【讨论】:

【参考方案3】:

您可以创建一个要检查的字符集合,并查看该集合是否包含相关字符。 HashSet 是 O(1) 查找时间的理想选择。 (没关系,因为大小是恒定的。)

private static final HashSet<Character> vowels = new HashSet<Character>();

//Initialize vowels hashSet to contain vowel characters
static
    vowels.add('a');
    vowels.add('e');
    vowels.add('i');
    vowels.add('o');
    vowels.add('u');
    vowels.add('A');
    vowels.add('E');
    vowels.add('I');
    vowels.add('O');
    vowels.add('U');


public static boolean isVowel(Character c)
    return vowels.contains(c);

【讨论】:

【参考方案4】:

在我们有 Unicode 之前,当字符集只有 128 个字符 (ASCII) 或更高的 256 个字符 (ISO 8859-1) 时,我们通常会创建一个布尔数组并使用字符代码查找——非常快速地。您仍然可以这样做(按照今天的内存标准,65536 booleans 的数组并不是那么大),或者类似的东西

static boolean[] vowelSet = new boolean[128]; // all initialized to false by default

static 
    vowelSet['A'] = true;
    vowelSet['E'] = true;
    ...
    vowelSet['u'] = true;

然后查找:

boolean isVowel(char ch) 
    return ch < 128 && vowelSet[ch];

如果效率极其重要,我认为这仍然是我会采取的方法。通常不是,因此其他答案之一可能会为您提供更具可读性的代码。

【讨论】:

被视为位域的longs 数组甚至更小——而且它是启动的标准 API :)

以上是关于是否可以检查字符是否与可能性列表匹配?的主要内容,如果未能解决你的问题,请参考以下文章

Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法

是否可以生成与正则表达式字符串匹配的字符串?

C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”

检查列表是不是有一个或多个与正则表达式匹配的字符串

如何检查字符串是不是包含字符列表?

如何检查数组列表是不是包含特定的字符串值? [复制]