Как разделить (+ знак) на строки, чтобы его можно было читать как переменную / Int? - PullRequest
0 голосов
/ 17 августа 2011

Этот вопрос довольно сложен для упрощения:

Я загружаю некоторые строки через XML (XStream).

например, Ваш общий счет + переменная +.

Результат будет

"Ваш общий счет + переменная +."

когда это в идеале должно быть

"Ваш общий счет" + переменная + "." aka "Ваш общий счет 1."

Проблема: (если вы ее не видите) она читает переменную, как если бы она была String.

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

так:

"Ваш общий счет 50, хотите ли вы печенье?"

он же

"Ваш общий счет" + переменная + ", хотите ли вы печенье?"

Большое спасибо!


Хорошо, я согласен, это очень запутанно. Я редактировал этот пост (читайте ниже). Ну, я загружаю некоторые строки через XML, это может быть тот же случай, если я загружаю их через .txt или файл конфигурации.

В файле XML я выложил его так:

<list>
    <dialogue>
    <line>
    <string> Your total count is + Somewhere.totalCount +, Would you like a cookie?</string>
</line>
    </dialogue>
</list>

Как видите, XML-файл не может определить местонахождение переменной (в классе) и не может распознать, является ли она переменной или строкой.

Я знаю, что мне нужно будет изменить способ его чтения, поэтому, если в строке есть знак плюса (+), он просто «отделит» его от исходной строки, чтобы я мог подключить его заново.

например. Your phone number is + PhoneBook.phoneNumber + should I call you? как это будет читаться из файла XML.

Я хочу «разделить» строку вперед-назад, вот так:

"Your phone number is " + PhoneBook.phoneNumber + " should I call you?" В то же время я не присваиваю переменную, поскольку она уже объявлена ​​в файле XML, я хочу, чтобы она распознала ее как int.

Ответы [ 3 ]

0 голосов
/ 17 августа 2011

Во-первых, Java не может знать, что + переменная + часть вашей строки должна быть заменена значением соответствующей переменной, а также не обеспечивает некоторую функциональность, подобную eval, как PHP или другие языки сценариев, которые могут помочь вам с этим.

Если вы хотите точно заменить эту конкретную часть '+ variable +' строки, это можно сделать так:

int variable = 1;

String text = "Your total count is +variable+.";
String textWithVariableValue = text.replaceAll("\\+variable\\+", Integer.toString(variable));

Но если вы хотите заменить переменные произвольными именами, вам придется сначала поместить их в Map, а затем найти все вхождения + somename + в строке и заменить его соответствующим значением, хранящимся на карте. Примерно так:

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("var1", 1);
variables.put("foo", 5);

String text = "var1 = +var1+, foo = +foo+";
String textWithVariableValues = text;
for (String variableName : variables.keySet()) {
    Object variableValue = variables.get(variableName);
    textWithVariableValues = textWithVariableValues.replaceAll("\\+" + variableName + "\\+", variableValue.toString());
}
0 голосов
/ 17 августа 2011

Похоже, что вам нужно это Метод String.format ():

int total = calculateTotal();
String s = String.format("Your total is %1d.", total);
0 голосов
/ 17 августа 2011

Не разбить, но найти и заменить.

Упрощенно

int variable = 1;
String src = "Your total count is +variable+.";
String result = src.replaceAll("\\+variable\\+.", Integer.toString(variable));
System.out.println(result);

Должно быть напечатано "Ваш общий счет 1".

РЕДАКТИРОВАТЬ: (после вашего комментария) Если вам нужно заменить несколько переменных за один раз, то у меня работает следующее:

// Replace the ff. with the actual map of variables & values
Map<String, String> vars = Collections.singletonMap(
    "variable", Integer.toString(123));

String src = "Your total count is +variable+.";
Pattern p = Pattern.compile("\\+(\\w+)\\+");
StringBuffer sb = new StringBuffer();
Matcher m = p.matcher(src);
while (m.find()) {
    String varName = m.group(1);
    if (vars.containsKey(varName)) {
        m.appendReplacement(sb, vars.get(varName));
    }
}
m.appendTail(sb);
System.out.println(sb.toString());

Выводит «Ваш общий счет 123».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...