2012-04-26 73 views
2

我有一个很长的字符串,它是动态的。凡找到%XXX%的地方,我必须得到XXX值并用其他值替换。将有多个%XXX%。 如何获取%%内的值?如何将一个字符串的多个子字符串替换为java中的多个值?

例如,

"POLICY_NO = %POLNO% and b.ACTION_TIME = (select max(ACTION_TIME) from POLICY_DETAILS where POLICY_NO = %POLICYID%)" 

如何读取2 %之间的每个值?我必须接受POLNO并将它与某些会话变量(例如,POLNO = 1234567,POLICYID = 3)进行比较,如果匹配,则必须替换会话变量值。那么查询sholud变得

“POLICY_NO = 1234567和b.ACTION_TIME =(从选择最大POLICY_DETAILS(ACTION_TIME)其中POLICY_NO = 3)”

+0

因此字符串中的每个不同的“属性”应该用不同的值替换?预先知道所有可能的“属性”(即有6个可能的值)? – 2012-04-26 11:15:09

+0

属性是可能的值,如POLNO,POLID ..我必须先从2%中获取值。下一步比较地图keys..If发现然后必须替换具体密钥的地图值... – 2012-04-26 11:57:16

回答

3

评论仅考虑字符串替代:

  • 如果你不知道你应该替换哪些变量或它的值,你可以做的是:

    // Map simulate your session variables. 
    Map<String, String> variables = new HashMap<String, String>(); 
    variables.put("POLNO", "V1"); 
    variables.put("POLICYID", "V2"); 
    
    String input = 
    /**/"POLICY_NO = %POLNO% and A.POLICY_DETAILS_ID = " + 
    /**/"b.POLICY_DETAILS_ID and b.ACTION_TIME = " + 
    /**/"(select max(ACTION_TIME) from POLICY_DETAILS " + 
    /**/"where POLICY_NO = %POLICYID%)"; 
    
    StringBuilder output = new StringBuilder(input); 
    
    int offset = 0; 
    
    Matcher matcher = Pattern.compile("(%)([^%]*)(%)").matcher(input); 
    while (matcher.find()) { 
        // Get only second group (variable name), ignoring % symbols 
        String variable = matcher.group(2); 
        String value = variables.get(variable); 
    
        // Calculate the offset. 
        // The previous replaces can change the string length 
        int start = matcher.start() + offset; 
        int end = matcher.end() + offset; 
    
        // Replace %XXX% by its value 
        output.replace(start, end, value); 
    
        offset -= variable.length() + 2 - value.length(); 
    } 
    
  • 否则,你可以乘链条电话:

    String.replace("%XXX%", "VALUE") 
    
+0

这很棒..工作..非常感谢你.. – 2012-04-26 13:00:11

3

String.format()类方法的方法,但如果是用于SQL你应该考虑使用PreparedStatement那些是标准的java类。

这里的String.format

String formatted = String.format("%d is a number and %s is another string", 20, "Test"); 
System.out.println(formatted); 
+0

这是好的..但可能的变量,如POLNO,POLID ..我必须首先从2%获得变量。下一步比较与地图keys..If发现然后必须取代具体键的地图值... – 2012-04-26 13:43:01

3

井的例子,你可以使用PatternMatcher拿到两个百分号(%)之间的所有字符串。为此,请尝试以下表达式:%([^%]*)%

您仍然必须评估您找到的字符串。

或者,如果您知道这里可能发生什么(或应该支持什么),请使用someString.replace("%POLNO%", "somevalue")

Howver,如果这是SQL,你可能想寻找到预处理语句(与some extensions),或部分或映射器来代替。在这种情况下你基本拥有的是命名参数。

2

我同意你应该使用PreparedStatement来防止SQL注入。

但是,如果你决定做字符串替换,appendReplacement正常工作:

final String in = "POLICY_NO = %POLNO% and A.POLICY_DETAILS_ID = b.POLICY_DETAILS_ID and b.ACTION_TIME = (select max(ACTION_TIME) from POLICY_DETAILS where POLICY_NO = %POLICYID%)"; 

// initialize map 
final Map<String, String> map = new HashMap<String, String>(); 
map.put("POLNO", "1234567"); 
map.put("POLICYID", "3"); 

final Pattern pattern = Pattern.compile("%.*?%"); 
final Matcher matcher = pattern.matcher(in); 
final StringBuffer sb = new StringBuffer(); 
while (matcher.find()) { 
    final String found = matcher.group(); 
    final String withoutPercents = found.substring(1, found.length() - 1); 
    matcher.appendReplacement(sb, map.get(withoutPercents)); 
    // instead of map.get(), there could be session.getAttribute(withoutPercents ) 
} 
matcher.appendTail(sb); 
System.out.println(sb.toString()); 

UPD:根据以下

+0

嗨Betlista,那里地图只包含会话变量only..But不与%...所以请加强它到只与POLNO,POLNOID合作... – 2012-04-26 13:04:16

+0

@ Mr.Chowdary更新;-) – Betlista 2012-04-26 13:16:31

+0

感谢Betlista ..它运作良好.. – 2012-04-26 13:49:24

相关问题