В переменной position
хранится номер события, который вы хотите заменить. Как и в вашем случае, вы пытались заменить 5-й, поэтому теперь он сохраняется как 5.
Pattern p = Pattern.compile("#");
Matcher m = p.matcher(chart);
int count = 0;
int position = 5;
int index = 0;
while (m.find()) {
count++;
if (count == position - 1) {
index = m.end();
}
}
String regex = "([#\n]{" + index + "})(#)([#\\n]{1,})";
chart = chart.replaceAll(regex, "$1/$3");
System.out.println(chart);
То, что я делаю здесь, это сначала я выясню, на каком символе заканчивается n-1 вхождение, и сохранил его в index . После этого в replaceAll [116 ] У меня есть регулярное выражение, которое группирует строку из трех частей: одна перед заменяемым символом, следующая группа содержит только один символ, который является n-ым вхождением, а последняя группа содержит оставшиеся. $1/$3
означает замену всей строки на group1 , затем / и затем group3 .
It's my understanding that this can't be done. At a fundamental level, the JVM only generates events for O/S events it receives, and it only receives O/S input events when it has focus.
I am sure you could use JNI to trigger the O/S to generate events for all input, but that would be very O/S dependent.
I'm not aware of any way to get around that either. I did find this link on Java's forums with a good example of how to setup the JNI stuff and make a global keyboard handler (too much to add here). It's a little dated (2005), but the example looks thorough enough to get you started.