Java: Как перевернуть строку на основе разделителей без алфавита c? - PullRequest
0 голосов
/ 08 апреля 2020

Как перевернуть строку на основе не алфавита c разделителей? Я подозреваю, что мое регулярное выражение может быть проблемой.

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;--

Ответы [ 3 ]

2 голосов
/ 09 апреля 2020

Вам не нужно регулярное выражение для этого. Кажется, вы хотите изменить символы, которые являются только алфавитами или цифрами. Тогда вы можете сделать это следующим образом - получить начальный и конечный индексы массива символов, где вы найдете символ как букву или ди git, а затем повернуть вспять. Затем верните новую строку с переставленными символами.

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--;
    }
  }

Вы можете проверить этот код здесь

1 голос
/ 09 апреля 2020

Ваш код работает с двумя изменениями:

  1. Заменить шаблон
  2. Тест для конечного разделителя

String fileContent = "Joe '); MAKE ТЕСТ ПОЛУЧЕННЫЙ; - "; 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();
1 голос
/ 08 апреля 2020

Вы можете сопоставлять и переворачивать только куски из 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 демонстрацию онлайн .

...