#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
.