Индексирование разных результатов при вводе с пробелами

#java #string

#java #строка

Вопрос:

Я столкнулся с небольшой проблемой при получении всех строк между двумя разделителями. Как я видел в других связанных вопросах, (один из) способов получения символов между двумя разделителями заключается в следующем: учитывая некоторую строку, в моем примере здесь "void foo(int a, int b) {" я хочу получить каждый символ между круглыми скобками. Использование:

 String parameters = currLine.trim().substring(currLine.indexOf("("),
                    currLine.indexOf(")")-1);
 

Где currLine , конечно "void foo(int a, int b) {" .
Теперь все работает отлично, так как я получаю "int a, int b" строки.
Проблема в том, что со строкой, подобной следующей:

     void                    foo                   (    int a      ,      String      b              )               {                 
 

Я понимаю, что:
параметры = "nt a , String b ) "
И я понятия не имею, как это исправить, не вызывая проблем с первым случаем.

Комментарии:

1. Вы обрезали текст, но вы вычислили индекс круглых скобок в необрезанном тексте, поэтому ваши индексы неверны. Вероятно, лучше просто обрезать результат в конце и не обрезать заранее.

2. Строка неизменяема. trim() метод не изменяет исходную строку, а создает новую (поэтому currLine все еще содержит исходную не обрезанную строку, и индексы, которые вы получаете, также основаны на ней). Также я не уверен, чего вы пытаетесь достичь, используя trim() here. Рассмотрите возможность уточнения его цели в вопросе.

3. Пока вы играете с синтаксическим анализом строк, вы можете захотеть проверить регулярные выражения. Как только вы это получите, вы не сможете любить без этого!

4. Да @MM1, но проблема возникает при вычислении indexOf , вы выполняете эту операцию над оригиналом String , а не над обрезанным.

5. Да, это верно @MM1

Ответ №1:

Проблема в том, что trim не изменяет оригинал String . Как следствие, при вычислении substring вы получаете разные результаты в зависимости от того, содержит ли ввод String пробелы в начале или в конце, поскольку indexOf он работает с оригиналом String .

Одним из возможных решений может быть следующее:

 // Trim the value
String trimmed = currLine.trim();
// And operate with it
String parameters = trimmed.substring(trimmed.indexOf("("),
                    trimmed.indexOf(")")-1);
 

Возможным лучшим подходом было бы вычислить регулярное выражение по предоставленному значению для извлечения информации между круглыми скобками, что-то вроде:

 Matcher m = Pattern.compile("\((.*?)\)").matcher(currLine);
if (m.find()) {
  String parameters = m.group(1);
  // Operate with parameters
}
 

Ответ №2:

Это должно быть следующим:

 String parameters = currLine.substring(currLine.indexOf("(")   1, currLine.indexOf(")")).trim();
 

ДЕМОНСТРАЦИЯ:

 public class Main {
    public static void main(String[] args) {
        String currLine = "void                    foo                   (    int a      ,      String      b              )               {                 ";
        String parameters = currLine.substring(currLine.indexOf("(")   1, currLine.indexOf(")")).trim();
        System.out.println(parameters);
    }
}
 

Вывод:

 int a      ,      String      b
 

Обратите внимание, что String#substring(int beginIndex, int endIndex) возвращает подстроку, начинающуюся с указанного beginIndex и расширяющуюся до символа в индексе endIndex - 1 .