当前位置: 首页 > 面试题库 >

等效于具有多个字符定界符的StringTokenizer

龙晟睿
2023-03-14
问题内容

我尝试将字符串拆分为令牌。

标记定界符不是单个字符,有些定界符包含在其他定界符中(例如&和&&),我需要将定界符作为标记返回。
StringTokenizer无法处理多个字符定界符。我认为String.split可以实现,但是无法猜测出适合我需要的神奇正则表达式。

任何想法 ?

例:

Token delimiters: "&", "&&", "=", "=>", " "  
String to tokenize: a & b&&c=>d  
Expected result: an string array containing "a", " ", "&", " ", "b", "&&", "c", "=>", "d"

-–编辑—
感谢所有人的帮助,Dasblinkenlight为我提供了解决方案。这是我在他的帮助下编写的“即用型”代码:

private static String[] wonderfulTokenizer(String string, String[] delimiters) {
  // First, create a regular expression that matches the union of the delimiters
  // Be aware that, in case of delimiters containing others (example && and &),
  // the longer may be before the shorter (&& should be before &) or the regexpr
  // parser will recognize && as two &.
  Arrays.sort(delimiters, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
      return -o1.compareTo(o2);
     }
  });
  // Build a string that will contain the regular expression
  StringBuilder regexpr = new StringBuilder();
  regexpr.append('(');
  for (String delim : delimiters) { // For each delimiter
    if (regexpr.length() != 1) regexpr.append('|'); // Add union separator if needed
    for (int i = 0; i < delim.length(); i++) {
      // Add an escape character if the character is a regexp reserved char
      regexpr.append('\\');
      regexpr.append(delim.charAt(i));
    }
  }
  regexpr.append(')'); // Close the union
  Pattern p = Pattern.compile(regexpr.toString());

  // Now, search for the tokens
  List<String> res = new ArrayList<String>();
  Matcher m = p.matcher(string);
  int pos = 0;
  while (m.find()) { // While there's a delimiter in the string
    if (pos != m.start()) {
      // If there's something between the current and the previous delimiter
      // Add it to the tokens list
      res.add(string.substring(pos, m.start()));
    }
    res.add(m.group()); // add the delimiter
    pos = m.end(); // Remember end of delimiter
  }
  if (pos != string.length()) {
    // If it remains some characters in the string after last delimiter
    // Add this to the token list
    res.add(string.substring(pos));
  }
  // Return the result
  return res.toArray(new String[res.size()]);
}

如果您仅通过一次创建Pattern就可以有很多要标记的字符串,则可能是最佳选择。


问题答案:

您可以使用Pattern和简单循环来获得所需的结果:

List<String> res = new ArrayList<String>();
Pattern p = Pattern.compile("([&]{1,2}|=>?| +)");
String s = "s=a&=>b";
Matcher m = p.matcher(s);
int pos = 0;
while (m.find()) {
    if (pos != m.start()) {
        res.add(s.substring(pos, m.start()));
    }
    res.add(m.group());
    pos = m.end();
}
if (pos != s.length()) {
    res.add(s.substring(pos));
}
for (String t : res) {
    System.out.println("'"+t+"'");
}

这将产生以下结果:

's'
'='
'a'
'&'
'=>'
'b'


 类似资料:
  • 问题内容: 我想根据所有可能的分隔符(例如逗号,冒号,半冒号,句号,空格,hihenhen等)来解析整个文件。 假设我有一个假设的字符串行“ Hi,X How-how are:any you?” 我应该得到带有项目Hi,X,How,how,are,any和you的输出数组。 如何在String.split方法中指定所有这些定界符? 提前致谢。 问题答案: 接受一个正则表达式,在这种情况下,您希望将

  • 问题内容: 我有一个应该在课程中使用StringTokenizer的字符串。我已经制定了如何实施该项目的计划,但是我找不到如何将每个字符都用作分隔符的参考。 基本上,我需要将一个字符串(例如“河马校园是聚会场所”)划分为每个字符的令牌,然后将它们与一组值进行比较,然后将一个特定的值交换出来。我知道如何做其他所有事情,但是分隔每个字符的分隔符是什么? 问题答案: 如果您真的想使用StringToke

  • 问题内容: 我有一个应该在课程中使用StringTokenizer的字符串。我已经制定了如何实施该项目的计划,但是我找不到如何将每个字符都用作分隔符的参考。 基本上,我需要将一个字符串(例如“河马校园是聚会场所”)划分为每个字符的令牌,然后将它们与一组值进行比较,然后将一个特定的值交换出来。我知道如何做其他所有事情,但是分隔每个字符的分隔符是什么? 问题答案: 如果您真的想使用StringToke

  • 问题内容: 我一直试图将一些使用(有界)通配符泛型的Java代码转换为C#。我的问题是,Java与通配符一起使用时似乎允许泛型既协变又协变。 [这是从先前的问题中衍生出来的,该问题处理的是更简单的有界通配符案例] Java-作品: C# -无法编译… 如果我更改interface IGeneric1 为interface IGeneric1 上述错误,错误会消失,但会method1WithPara

  • 问题内容: 快速提问。是否有等效于@的Java字符串: 例如,我可以使用C#进行处理,并使其在处理时忽略转义字符,而不必这样做。是否有Java等效项? 嗯:stackoverflow正在向我逃脱..大声笑。第二个示例应为: c :(双反斜杠)文件夹(双反斜杠)aFile 问题答案: 没有。转义/外部化字符串是您唯一的选择。

  • 问题内容: 使用I,可以轻松地连接流中所有用逗号分隔的字符串。可能的结果是。但是,如果我希望最后一个定界符不同,该怎么办。例如,使我得到结果。有一个简单的解决方案吗? 问题答案: 如果它们已经在列表中,则不需要流。只需加入除最后一个元素以外的所有元素的子列表,并连接另一个定界符和最后一个元素: 这是使用上述功能的版本 此版本还可以处理流为空或只有一个值的情况。感谢Holger和Andreas的建议