【问题标题】:Java: How to reverse string based on non alphabetic delimiters?Java:如何根据非字母分隔符反转字符串?
【发布时间】:2020-04-08 20:49:41
【问题描述】:

如何根据非字母分隔符反转字符串?我怀疑我的正则表达式可能是问题所在。

String fileContent = "Joe'); MAKE TEST random;--";
String[] splitWords = fileContent.split("[^a-zA-Z0-9']+");

StringBuilder stringBuilder = new StringBuilder();
for (String word : splitWords) {
    int idx = fileContent.indexOf(word, stringBuilder.length());
    String delim = fileContent.substring(stringBuilder.length(), idx);
    stringBuilder.append(delim);

    StringBuilder output = new StringBuilder(word).reverse();
    stringBuilder.append(output);
}
return stringBuilder.toString();

当前输出:'eoJ); EKAM TSET modnar

所需输出:eoJ'); EKAM TSET modnar;--

【问题讨论】:

  • 您的测试用例以分隔符结尾。因此最后一个 ;-- 没有附加。

标签: java regex string algorithm reverse


【解决方案1】:

您不需要正则表达式。您似乎想要反转仅是字母或数字的字符。 然后你可以这样做 - 获取字符数组的开始和结束索引,你发现字符是字母或数字,然后就地反转。然后返回一个字符反转的新字符串。

private static void reverseWords(char[] c) {
    int start = 0, end = c.length;
    while ( start < end ) {
      int pre = start;
      while ( start < c.length && Character.isLetterOrDigit(c[start]) ) 
        start++;
      if ( pre < start ) 
         reverseWord(c, pre, start-1);
      start++;  
    }
  }

  private static void reverseWord(char[] c, int start, int end) {
    while ( start < end ) {
      char temp = c[start];
      c[start] = c[end];
       c[end]  = temp;
      start++;
      end--;
    }
  }

你可以测试这段代码here

【讨论】:

    【解决方案2】:

    您可以只匹配和反转 1+ 个字母的块(使用简单的\p{L}+ 模式),其余部分保持原样:

    String s = "Joe'); MAKE TEST random;--";
    StringBuffer result = new StringBuffer();
    Matcher m = Pattern.compile("\\p{L}+").matcher(s);
    while (m.find()) {
        String replacement = new StringBuilder(m.group()).reverse().toString();
        m.appendReplacement(result, replacement);
    }
    m.appendTail(result);
    System.out.println(result.toString()); // => eoJ'); EKAM TSET modnar;--
    

    请参阅Java demo online

    【讨论】:

      【解决方案3】:

      您的代码有两个变化:

      1. 替换模式
      2. 测试尾随分隔符

      String fileContent = "Joe'); MAKE TEST random;--"; String[] splitWords = fileContent.split("\W"); // W 是非单词字符或 我忘记了

      StringBuilder stringBuilder = new StringBuilder();
      for (String word : splitWords) {
          int idx = fileContent.indexOf(word, stringBuilder.length());
          String delim = fileContent.substring(stringBuilder.length(), idx);
          stringBuilder.append(delim);
      
          StringBuilder output = new StringBuilder(word).reverse();
          stringBuilder.append(output);
      }
      // did we have trailing delimiter ?
      if(fileContent.length()!=stringBuilder.length())
      { //append remaining
          stringBuilder.append(fileContent.substring(stringBuilder.length()));
      }
      return stringBuilder.toString();
      

      【讨论】:

      • 我正在努力设计这个 sn-p 的样式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多