Java 方法:如何确保处理后的字符不再被替换

Java 方法:如何确保处理后的字符不再被替换,java,regex,string,Java,Regex,String,我从一个包含以下两行的文件中读取:“hello hi”和“hii hey”。 每行的第一个字符串是正则表达式,第二个是替换字符串,即string.replaceAll(“hello”、“hi”)。我应该遍历文件中的每一行,以替换字符串中的正则表达式。然而,有一个陷阱。处理后的字符不应再被替换 例如,我有一个字符串:“helloi”。 在第一行之后,我有“hii”。 在第二行之后,天真的方法会导致“嘿” 我想确保“hii”仍然保持为“hii”,因为它已经包含处理过的字符 请注意,我所使用的字符串(

我从一个包含以下两行的文件中读取:“hello hi”和“hii hey”。 每行的第一个字符串是正则表达式,第二个是替换字符串,即string.replaceAll(“hello”、“hi”)。我应该遍历文件中的每一行,以替换字符串中的正则表达式。然而,有一个陷阱。处理后的字符不应再被替换

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

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

请注意,我所使用的字符串(“helloi”)只是一个简单的字符串,实际的字符串将很大,并且包含多行

你是如何实现的


编辑:让我用一个例子来更清楚地解释我的情况。我有一个字符串“你好”。在文件的第一行之后,我有“hii-hii”。但是在第二行之后,我会说“嗨嗨”。第一个“hii”包含已处理的字符,因此不会在每次调用
字符串时替换它。replaceAll
您应该在
哈希集中插入搜索和替换字符串。在调用
String.replaceAll
之前,检查此哈希集中是否存在搜索和替换字符串

仅当哈希集中不存在搜索字符串和替换字符串时,才调用
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);
}
//开始时
Set processed=新的HashSet();
//逐行读取文件,并将其放入文件处理循环中
如果(!processed.contains(搜索)&&!processed.contains(替换)){
字符串repl=line.replaceAll(搜索、替换);
已处理。添加(搜索);
已处理。添加(替换);
}

我想每次调用
String.replaceAll
时,都应该将搜索和替换字符串插入
哈希集中。在调用
String.replaceAll
之前,检查此哈希集中是否存在搜索和替换字符串

仅当哈希集中不存在搜索字符串和替换字符串时,才调用
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);
}
//开始时
Set processed=新的HashSet();
//逐行读取文件,并将其放入文件处理循环中
如果(!processed.contains(搜索)&&!processed.contains(替换)){
字符串repl=line.replaceAll(搜索、替换);
已处理。添加(搜索);
已处理。添加(替换);
}

我想每次调用
String.replaceAll
时,都应该将搜索和替换字符串插入
哈希集中。在调用
String.replaceAll
之前,检查此哈希集中是否存在搜索和替换字符串

仅当哈希集中不存在搜索字符串和替换字符串时,才调用
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);
}
//开始时
Set processed=新的HashSet();
//逐行读取文件,并将其放入文件处理循环中
如果(!processed.contains(搜索)&&!processed.contains(替换)){
字符串repl=line.replaceAll(搜索、替换);
已处理。添加(搜索);
已处理。添加(替换);
}

我想每次调用
String.replaceAll
时,都应该将搜索和替换字符串插入
哈希集中。在调用
String.replaceAll
之前,检查此哈希集中是否存在搜索和替换字符串

仅当哈希集中不存在搜索字符串和替换字符串时,才调用
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);
}
//开始时
Set processed=新的HashSet();
//逐行读取文件,并将其放入文件处理循环中
如果(!processed.contains(搜索)&&!processed.contains(替换)){
字符串repl=line.replaceAll(搜索、替换);
已处理。添加(搜索);
已处理。添加(替换);
}

我不完全明白,但您能否使用string属性和boolean属性创建自己的类,以指示它是否已被修改?将字符串拆分为该类的一个数组,并处理每个数组。

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

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

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

string.replaceAll()可能无法为您完成此工作

我建议使用类似于此psuedo代码的代码

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))
}
搜索与regex
(.*)(hi | hello | hey | what's up)
匹配的字符串,这是所有映射键(即您要搜索的内容)。\将以Java文本形式结束,如
“what\\s up”
,因为正则表达式字符串需要知道如何转义

每次迭代,查看捕获的内容。第一组是自上次比赛以来的一切。第二组是要替换的单词/短语。如果单词是“hi”,您希望将其替换为“woah”,因此请在地图中查找“hi”的替换项。

String.replaceAll()可能无法为您完成此任务

我建议使用类似于此psuedo代码的代码

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))
}
搜索与regex
(.*)(hi | hello | hey | what's up)
匹配的字符串,这是所有映射键(即您要搜索的内容)。\将以Java文本形式结束,如
“what\\s up”
,因为正则表达式字符串需要知道如何转义

每次迭代,lo