我有一个像这样的字符串表达式:
(code name credits) or ((code name credits) and (code name credits))
我想识别字符串中的所有(代码名称信用)组合,并用值替换它们。
代码是字母和数字的组合。
名称是由单个空格分隔的单词组合,单词可以包含字母和数字。
信用是一个数字。
每个组件由标签分隔。
(代号名称积分)组合的实际示例如下:
IABIG-02 Computer Graphics 5
这与问题无关,但这是我想要实现的目标:
输入:
(IABIG-02 Computer Graphics 5) or ((AIBJH88 Computer Vision 5) and (AIKKH10 Computer Architecture 5))
输出:
T or (F and T)
答案 0 :(得分:1)
这是一种潜在的方法,我找不到任何干净的方法来实现它:
String value = "(IABIG-02\tComputer Graphics\t5) or ((AIBJH88\tComputer Vision\t5) and (AIKKH10\tComputer Architecture\t5))";
Pattern pattern = Pattern.compile("\\((\\w|-)+\\t\\w+( \\w+)*\\t\\d\\)");
Matcher matcher = pattern.matcher(value);
StringBuilder builder = new StringBuilder(value.length());
Map<String, Character> replacements = new HashMap<>();
char c = 'A';
int index = 0;
while (matcher.find(index)) {
builder.append(value, index, matcher.start());
String found = matcher.group();
Character replacement = replacements.get(found);
if (replacement == null) {
replacement = c++;
replacements.put(found, replacement);
}
builder.append(replacement);
index = matcher.end();
}
if (index < value.length()) {
builder.append(value, index, value.length());
}
System.out.println(builder);
<强>输出:强>
A or (B and C)
它取代了从A
开始的替换字符找到的所有模式。我使用Map
以便能够重复使用先前给出的相同精确模式的字符。