2013-11-22 48 views
0

我試圖找出一種安全地用其他字符串替換字符串中整數的方法。 基本上輸入將是一個字符串,比如說「1或2和3」。然後我會得到一個字符串列表。在這種情況下,它將是一個3個字符串的列表。例如,「名稱= 1」,「名稱= 2」和「名稱= 3」。在java中替換字符串中的數字

然後我需要用字符串替換整數。

下面是一個例子:

import java.text.MessageFormat; 

public class TestStringBuilder 
{ 
    public static void main(String[] args) 
    { 
     TestStringBuilder builder = new TestStringBuilder(); 
     String output; 
     String[] filters = { "Name = 1", "Name = 2", "Name = 3" }; 
     output = builder.buildString(filters); 
     System.out.println(output); 
     output = builder.formatString(filters); 
     System.out.println(output); 
     System.out.println(); 

     /* Now swap around first two strings */ 
     String[] filters2 = { "Name = 2", "Name = 1", "Name = 3" }; 
     output = builder.buildString(filters2); 
     System.out.println(output); 
     output = builder.formatString(filters2); 
     System.out.println(output); 
     } 

    private String formatString(Object[] filters) 
    { 
     /* Wrap integers in {} here first */ 
     String advanced = "{1} OR {2} OR {1}"; 
     return MessageFormat.format(advanced, filters); 
    } 

    private String buildString(String[] filters) 
    { 
     String advanced = "1 OR 2 OR 1"; 
     /* 
     * Now replace the numbers with the actual filters in human readable 
     * form. Note: We loop from 10 to 1 so that 10 is replaced first. If we 
     * loop from 1 to 10, 1 will replace 1 and 10 incorrectly. 
     */ 
     for (int i = filters.length; i > 0; i--) 
     { 
      /* Index for 0 based array */ 
      String filter = filters[i - 1]; 
      if ((filter != null) && (filter.length() > 0)) 
      { 
       advanced = advanced.replaceAll(Integer.toString(i), filter); 
      } 
     } 
     return advanced; 
    } 
} 

首先,我只是做了一個簡單的String.replaceAll。問題是,如果我輸入的字符串包含一個整數,這可能會被替換。

E.g.

我使用String陣列String[] filters = { "Name = 1", "Name = 2", "Name = 3" };

這工作得很好,並且輸出是:

Name = 1 OR Name = 2 OR Name = 1

然而,如果使用String[] filters = { "Name = 2", "Name = 1", "Name = 3" };

輸出不正確,爲1在「Name = 1」中也被替換爲:

Name = 2 OR Name = Name = 2 OR Name = 2

然後我嘗試使用java.Text.FormatMessage。但是,在這種情況下,我需要遍歷字符串以首先包裝所有整數,然後創建一個新的Object [],第一個值爲空。這是從運行上述實施例的輸出:

名稱= 2 OR名稱= 3或名稱= 2

名稱= 1 OR名稱= 3或名稱= 1

任何人是否有任何其他的想法?

+0

這是一個家庭作業問題或類似的地方,你必須使用該語法,或者你有靈活性來修改它嗎? – chrylis

+0

看看這個取代我所做的一切。你可能會在那裏找到你的解決方案:) http://fiddle.re/m4cke確保你使用該鏈接時單擊java按鈕。 –

+0

感謝您的回覆。 @ chrylis,這不是功課,所以我有充分的靈活性。 :) 這些字符串將全部由用戶通過用戶界面生成。我需要編寫一個可以安全地對任何字符串進行交換的方法。最多可以有10個字符串進行替換,因此有關從10循環到1的註釋。 如果用戶沒有爲高級輸入字符串,我只是將過濾器連接在一起。如果他們提供高級字符串,我需要安全地進行替換。 我需要閱讀正則表達式,因爲它們不是我喜歡的東西。 –

回答

2

您可以使用正則表達式(Pattern):

public static String format(String input, String[] args) { 
    StringBuffer sb = new StringBuffer(); 

    Matcher matcher = Pattern.compile("\\d+").matcher(input); 
    while (matcher.find()) { 
     int nr = Integer.parseInt(matcher.group()); 
     if (nr <= args.length) { 
      matcher.appendReplacement(sb, Matcher.quoteReplacement(args[nr - 1])); 
     } 
    } 

    matcher.appendTail(sb); 

    return sb.toString(); 
} 

關於Java正則表達式一個很好的教程,可以在這裏找到:http://tutorials.jenkov.com/java-regex/matcher.html

+0

我不知道該怎麼讀。 :(一些學習正則表達式的時間:)感謝您的回覆,我會在閱讀正則表達式時嘗試一下。 –

+0

我已經對它進行了簡短的測試,它適用於上面給出的基本示例。我會在週一花一些時間來理解它,同時閱讀一般的正則表達式。謝謝您的幫助。 –

+0

我已經添加了一個很好的教程的鏈接。另外請注意,我稍微更改了源代碼(簡化)! – isnot2bad

0

我不知道,可能是類似

String s = "1 OR 2 AND 3"; 
s=s.replace("1","Name=1"); 
s=s.replace("2","Name=2"); 
s=s.replace("3","Name=3"); 

雖然我不確定這是你想要的。