0

我想在一个文件中放入一些正则表达式并用分号(或其他东西)分隔另一个表达式,即:

orderNumber:* completionStatus;orderNumber:X completionStatus

我将有一个日志文件将有:

.... orderNumber:123 completionStatus...

我希望它们看起来像:

.... orderNumber:X completionStatus...

我怎样才能在 Java 中做到这一点?

我尝试使用(键:正则表达式和值:替换)创建一个 Map,读取我的日志文件并为每一行尝试匹配键,但我的输出看起来相同。

FileInputStream fstream = new FileInputStream(file);
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader( in ));
FileWriter fstreamError = new FileWriter(myFile.replace(".", "Replaced."));
BufferedWriter output = new BufferedWriter(fstreamError);

while ((strFile = br.readLine()) != null) {
    for (String clave: expressions.keySet()) {
        Pattern p = Pattern.compile(clave);
        Matcher m = p.matcher(strFile); // get a matcher object
        strFile = m.replaceAll(expressions.get(clave));
        System.out.println(strFile);
    }
}

对此有什么想法吗?

4

2 回答 2

1

看来你走在一条好路上。但是,我会建议几件事:

  1. 不要每次都编译正则表达式。您应该将它们全部预先编译,并在循环中从它们中生成新的匹配器。
  2. 您并没有真正将地图用作地图,而是将其用作对的集合。您可以轻松地制作一个小的class RegexReplacement,然后List<RegexReplacement>在循环中迭代一个。

class RegexReplacement { 
  final Pattern regex;
  final String replacement;
  RegexReplacement(String regex, String replacement) {
    this.regex = Pattern.compile(regex);
    this.replacement = replacement;
  }
  String replace(String in) { return regex.matcher(in).replaceAll(replacement); }
}

于 2012-07-24T18:57:52.353 回答
1

这是你想要的?

import java.text.MessageFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexpTests {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String text = "orderNumber:123 completionStatus";
    String regexp = "(.*):\\d+ (.*)";
    String msgFormat = "{0}:X {1}";

    Pattern p = Pattern.compile(regexp);
    Matcher m = p.matcher(text);

    MessageFormat mf = new MessageFormat(msgFormat);
    if (m.find()) {
        String[] captures = new String[m.groupCount()];
        for (int i = 0; i < m.groupCount(); i++) {
            captures[i] = m.group(i + 1);
        }
        System.out.println(mf.format(msgFormat, captures));
    }

}

}
于 2012-07-24T18:43:25.983 回答