0

我正在读取包含以下两行的文件:“hello hi”和“hii hey”。每行的第一个字符串是正则表达式,第二个是替换字符串,即String.replaceAll("hello", "hi")。我应该遍历文件中的每一行,用替换替换字符串中的正则表达式。但是有一个问题。处理后的字符不应再被替换。

例如我有这个字符串:“helloi”。在第一行之后,我有“hii”。在第二行之后,天真的方法会导致“嘿”。

我想确保“hii”仍然保留为“hii”,因为它已经包含处理过的字符。

请注意,我用作示例的字符串(“helloi”)只是一个简单的字符串,实际的字符串会很大并且包含多行。

你如何实现它?

编辑:让我用一个例子更清楚地解释我的情况。我有一个字符串“helloi hii”。在文件的第一行之后,我有“hii hii”。但是在第二行之后,我会有“hii hey”。第一个“hii”包含已处理的字符,因此不会被替换

4

3 回答 3

1

不完全确定我理解,但是您可以使用字符串属性和布尔属性创建自己的类来指示它是否已被修改?将您的字符串拆分为该类的数组并处理每个。

于 2013-10-13T03:08:47.837 回答
1

String.replaceAll() 可能不会为您完成这项工作。

我会建议类似于这个伪代码的东西

replacements -> HashMap<String, String>
StringBuffer result
regexStr = "("
for each key in replacements
    regexStr += key + "|" //key MUST not have any regex syntax or must be properly escaped
regexStr remove last '|' append ")"
Matcher m = Pattern.compile(regexStr).matcher()
while(matches) {
    get next match
    result.append(match group 1)
    result.append(replacements.get(match group 2))
}

本质上:

保留所有替代品的地图:

hi->woah
hello->hi
hey->what's up
what\'s up->fun

您搜索与正则表达式匹配的字符串(.*?)(hi|hello|hey|what\'s up),这是所有映射键(即您要搜索的内容)。\ 会以 Java 文字结尾为"what\\s up",因为正则表达式字符串需要知道才能转义'

每次迭代,看看捕获了什么。第一组是自上一场比赛以来的一切。第二组是要替换的单词/短语。如果单词“hi”,您想用“woah”替换它,所以在地图中查找“hi”的替换。

于 2013-10-13T03:17:13.283 回答
1

我猜你每次打电话String.replaceAll时都应该将搜索和替换字符串插入到HashSet. 在调用之前检查此 HashSet 中是否存在搜索和替换字符串String.replaceAll

仅当 HashSet 中不存在搜索字符串和替换字符串时,您才调用String.replaceAll.

// at start
Set<String> processed = new HashSet<String>(); 

// read file line by line and have this inside your file processing loop

if (!processed.contains(search) && !processed.contains(replacement)) {
   String repl = line.replaceAll(search, replacement);
   processed.add(search);
   processed.add(replacement);
}
于 2013-10-13T02:22:42.143 回答