我通过join("|").
任务,每个模式可以满足N个匹配
例如: (и\\s*\\.*\\s*т\\s*\\.?\\s*д\\s*\\.)
每个匹配被锤击成HashMap<String, String>,其中 <Hash, Match>
将每个匹配替换为源字符串中的一个哈希。
问题:由于某种原因,它只Matcher.find()执行一次循环迭代,并用|相同的哈希替换管道中的所有模式。
在这种情况下,除了手动编译单词列表之外该怎么做?
UPD
此任务的简化示例 ( https://ideone.com/d1UhRh ):
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.HashMap;
public class Main
{
static void processString(String line)
{
Pattern p = Pattern.compile("(1\\%?|2|3|4)"); // 5 Вариантов паттернов для теста
Matcher m = p.matcher(line); // Естественно в реальной задаче намного больше
HashMap<String, String> map = new HashMap<>();
int i = 0;
while (m.find()) {
// Здесь я ожидаю 5 итераций для каждого вхождения 1, 1%, 2, 3, 4 и замены их на ААА1, ААА1%, ААА2 и т.д.
// Эти вхождения добавить в HashMap (map) ниже
i++;
System.out.println("Нужно заменить " + m.group() + " на AAA" + i);
// Добавить $1 в хэшмап !!
// map.put(?)
// То есть если я передаю все 5 паттернов, то в map должно быть 5 записей
line = m.replaceAll("AAA$1");
}
System.out.println("\n\n" + line);
}
public static void main(String[] args)
{
processString(" 1 2 3 4 4 2 1% 1% 1 2 3 ");
}
}
结果:
AAA1 AAA1 AAA1 AAA1 AAA1 AAA1 AAA1 AAA1 AAA1 AAA1 AAA1
预期结果:
AAA1 AAA2 AAA3 AAA4 AAA4 AAA2 AAA1% AAA1% AAA1 AAA2 AAA3
UPD 2
增加了关于 HashMap 问题的说明
搜索只执行一次,因为它
Matcher.replaceAll替换了源字符串中的所有匹配项,然后重新启动matcher:如果您需要依次替换出现,那么您可以
Matcher.appendReplacement使用Matcher.appendTail:如果您需要将事件保存在 中
Map,那么您可以处理每个事件并记住哈希:在这种情况下,迭代次数将等于出现次数,而不是唯一出现次数。
这里,为方便起见,使用了映射
Совпадение -> Хэш,而不是Хэш -> Совпадение像问题中那样,但如果需要,也可以并行执行反向映射。添加什么的处理
1并1%归结为一个哈希来品尝。或者使用表达式(1|2|3|4)并保持百分比不变。Ideone 上的示例。