如何将字符串附加到原始文本的前面以生成新文本&然后在不影响原始文本的情况下去掉前面的字符串



好吧,这是我的问题。我有一个需要根据提供的信息格式化文本。对于某些约束,我只能将控制字符串附加到原始文本&在处理时,我必须跳出前字符串以获得原始文本。不是所有的文本都需要controlString。

,

String originalText1="iPhone";
String controlString= "colorLevel=2*";
String newText1 =controlString+originalText1; //ie newText=colorLevel=2*iPhone
String originalText2="iPhone 3G"; // this originalText2 has no controlString
String newText2="iPhone 3G";
String originalText3="colorLevel=2*aaa"; // this has no controlString but its front is exactly the same as controlString
String newText3="colorLevel=2*aaa";
String originalText4="colorLevel=2*bbb"; // has controlString but at the same time its front is exactly the same as controlString
String controlString= "colorLevel=2*";
String newText4 =controlString+originalText4; // ie newText4=colorLevel=2*colorLevel=2*bbb

好的,现在我需要一个函数来读取所有这些新文本。这个函数需要断开controlString以获得原始的。

所以我的问题是,如何编码原始文本的方式,当我们绊倒了新文本的前字符串,我们不会影响原始文本?

如果您不喜欢常量控制字符串。您可以根据输入构建控件字符串。

static final String delimiterChar = "~";
static final String controlStringPattern = "^~-?\d+~";
public static StringBuffer  encode(String orgText){
    StringBuffer buffer = new StringBuffer();
    buffer.append(delimiterChar);
    buffer.append(orgText.hashCode());
    buffer.append(delimiterChar);
    buffer.append(orgText);
    return buffer;
}

在这里,我在给定输入字符串的哈希码之前和之后添加了"~"。注意**,String的hashcode方法,将遍历字符串中的所有字符并执行31的乘法

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

所以这将基于给定的字符串。这可能会影响性能,如果你打算使用巨大的字符串作为org string。并且哈希码在对象的一个生命周期内只构建一次。

您可以将hashcode替换为任何您认为唯一的字符串。

解码
public static String  decode(String orgText){
    return  orgText.replaceAll(controlStringPattern, "");
}

更详细的解码。这确保给定数字的哈希码应该与Decoded String匹配。仔细检查

public static String  decode(String orgText){
    Matcher matcher = pattern.matcher(orgText);
    if (matcher.find()){
        String hashString = matcher.group();
        int hash = Integer.parseInt(hashString.substring(1,           hashString.length()-1));
        String txt = orgText.substring(hashString.length());
        if (txt.hashCode() == hash){
            return txt;
        }
    }
    return orgText;
}

执行测试

public static void main(String[] args) {
    //System.out.println(new String("~12345~").matches(controlStringPattern));
    String orgText = "Hi i am org Text";
    StringBuffer encodeText = encode(orgText);
    System.out.println("Orginial :" + orgText);
    System.out.println("Encoded :" + encodeText);
    System.out.println("Decoded :" + decode(encodeText.toString()));
    System.out.println("Decoded :" + decode("I am not Encoded"));
}

输出为

Orginial :Hi i am org Text
Encoded :~-1828588409~Hi i am org Text
Decoded :Hi i am org Text
Decoded :I am not Encoded

如果您想单独获得控件字符串..

public static String getControlStringifExists(String orgText){
    Matcher matcher = pattern.matcher(orgText);
    if (matcher.find()){
        String hashString = matcher.group();
        int hash = Integer.parseInt(hashString.substring(1, hashString.length()-1));
        String txt = orgText.substring(hashString.length());
        if (txt.hashCode() == hash){
            return hashString;
        }
    }
    return null;
}

相关内容

  • 没有找到相关文章