0

我在字符串中有以下表达式(来自文本文件):

{gender=male#his#her}
{new=true#newer#older}

我想:

  1. 找到该模式的出现{variable=value#if_true#if_false}
  2. 将这些变量临时存储在variableNamevariableValueifTrueifFalseas等字段中String
  3. 根据局部变量(如 String gender = "male" 和 String new = "true")variableName评估表达式。variableValue
  4. 最后根据(3)用ifTrue或替换模式。ifFalse

我应该String.replaceAll()以某种方式使用,还是如何查找此表达式并保存其中的字符串?谢谢你的帮助

更新

它类似于 PHP 的preg_match_all

更新 2

我通过使用Pattern和解决了这个问题,Matcher因为我在下面发布了答案。

4

2 回答 2

0

如果字符串总是采用这种格式,那么string.split('#')可能是要走的路。这将在 '#' 分隔符中返回一个字符串数组(例如 "{gender=male#his#her}".split('#') = {"{gender=male", "his", "her}" }; 用于substring删除第一个和最后一个字符以摆脱大括号)

于 2013-04-15T20:14:14.037 回答
0

经过一段时间的努力后,我设法使用它来完成这项工作PatternMatcher如下所示:

// \{variable=value#if_true#if_false\}
Pattern pattern = Pattern.compile(Pattern.quote("\\{") + "([\\w\\s]+)=([\\w\\s]+)#([\\w\\s]+)#([\\w\\s]+)" + Pattern.quote("\\}"));
Matcher matcher = pattern.matcher(doc);

// if we'll make multiple replacements we should keep an offset
int offset = 0;

// perform the search
while (matcher.find()) {
    // by default, replacement is the same expression
    String replacement = matcher.group(0);
    String field = matcher.group(1);
    String value = matcher.group(2);
    String ifTrue = matcher.group(3);
    String ifFalse = matcher.group(4);

    // verify if field is gender
    if (field.equalsIgnoreCase("Gender")) {
        replacement = value.equalsIgnoreCase("Female")?ifTrue:ifFalse;
    }

    // replace the string
    doc = doc.substring(0, matcher.start() + offset) + replacement + doc.substring(matcher.end() + offset);

    // adjust the offset
    offset += replacement.length() - matcher.group(0).length();
}
于 2013-04-15T22:23:14.283 回答