如何在字符串表达式Java中查找字符串模式?

时间:2016-04-22 13:51:28

标签: java regex string

我有一个像这样的字符串表达式:

(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) 

1 个答案:

答案 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以便能够重复使用先前给出的相同精确模式的字符。