3

我有以下字符串:

你在哪里[员工姓名]?你有 [Shift] 班次...

和一个字符串列表,其中包含:

1.员工姓名

2.换班

我需要在长字符串的列表中找到给定的字符串,并将它们替换为另一个内容(包括[]字符)。因此,例如第一个字符串需要更改为:

你在哪里约翰格林?你有早班...

有什么简单的方法可以做到这一点吗?usingIndexOf会给我这个字符串的位置,但我将如何包含[,字符]呢?

更新: 这是我到目前为止测试的代码:

    Scanner sc = new Scanner(smsText);

    for (String s; (s = sc.findWithinHorizon("(?<=\\[).*?(?=\\])", 0)) != null;) 
    {
         words.add(s);
    }

    for (int j = 0; j < words.size(); j++)  
    {  
        Log.d(TAG, "The value for column: "+words.get(j) +" is: "+ rowData.getValue(words.get(j)));
        smsText.replaceFirst("\\[" + words.get(j) + "\\]", rowData.getValue(words.get(j)));
    }

    Log.d(TAG, "Final String is: "+ smsText);

这没有给我正确的结果,字符串没有被替换。

UPDATE2: 对我有用的解决方案是:

    Scanner sc = new Scanner(smsText);

    for (String s; (s = sc.findWithinHorizon("(?<=\\[).*?(?=\\])", 0)) != null;) 
    {
         columnNames.add(s);
    }

    for (int j = 0; j < columnNames.size(); j++)  
    {  
        Log.d(TAG, "The value for column: "+columnNames.get(j) +" is: "+ rowData.getValue(columnNames.get(j)));
        smsText = smsText.replaceFirst("\\[" + columnNames.get(j) + "\\]", rowData.getValue(columnNames.get(j)));
    }
    Log.d(TAG, "Final String is: "+ smsText);

感谢大家的帮助。

4

4 回答 4

4
String key = myColumns.getName();
s.replaceFirst("\\[" + key + "\\]", myReplacements.getReplacement(key));

您也可以使用indexOf,但使用替换功能可以立即清楚您要做什么。

于 2013-05-05T13:03:40.247 回答
2

试试这个

    String s = "Where Are You [Employee Name]? your have a [Shift] shift..";
    Map<String, String> replacementMap = new HashMap<>();
    replacementMap.put("[Employee Name]", "John Green");
    replacementMap.put("[Shift]", "morning");
    for(Entry<String, String> e : replacementMap.entrySet()) {
        s = s.replace(e.getKey(), e.getValue());
    }
    System.out.println(s);

输出

Where Are You John Green? your have a morning shift..
于 2013-05-05T13:11:55.653 回答
1

一般解决方案可能如下所示:

String message = "Where are you [Employee Name]? You have a [Shift] shift!";
Map<String, String> variables = new HashMap<>();
variables.put("Employee Name", "John Green");
variables.put("Shift", "morning");
StringBuffer endResult = new StringBuffer();
Matcher m = Pattern.compile("\\[(.*?)\\]").matcher(message);
while (m.find()) {
    m.appendReplacement(endResult, variables.get(m.group(1)));
}
m.appendTail(endResult);
System.out.println(endResult.toString());
于 2013-05-05T13:10:53.663 回答
1

我知道正则表达式在那里,但如果你想在这里使用递归函数,那就是

   public string replaceString(string str, string[] values, int index)
    {
        if (str.IndexOf('[') == -1 || str.IndexOf(']') == -1 || index > values.Length-1)
            return str;
        else

            return replaceString(str.Replace(str.Substring(str.IndexOf('['), (str.IndexOf(']') - str.IndexOf('['))+1), values[index]), values, ++index);
    }

调用这个方法

     string strforreplac = "Where Are You [Employee Name]? your have a [Shift] shift...]";
           string[] strvalues = {"Emil","morning"};
      string newstring = replaceString(strforreplac,strvalues,0);
于 2013-05-05T13:20:28.390 回答