Вот некоторый Java-код, который работает. Это не просто регулярное выражение, но основано на:
Использование:
String str = "String m_sFoo;\n"
+ "Array m_arrKeepThings;\n"
+ "List<? extends Reader> m_lstReaders; // A silly comment\n"
+ "String.format(\"Hello World!\"); /* No m_named vars here */";
// Read the file you want to handle instead
NameMatcher nm = new NameMatcher(str);
System.out.println(nm.performReplacements());
NameMatcher.java
package so_6806699;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author martijn
*/
public class NameMatcher
{
private String input;
public static final String REGEX = "m_[a-z]+([A-Z0-9_\\$\\µ\\£]*)";
public static final Pattern PATTERN = Pattern.compile(REGEX);
public NameMatcher(String input)
{
this.input = input;
}
public String performReplacements()
{
Matcher m = PATTERN.matcher(input);
StringBuilder sb = new StringBuilder();
int oldEnd = 0;
while (m.find())
{
int start = m.start();
int end = m.end();
String match = input.substring(start, end);
String matchGroup1 = match.replaceAll(REGEX, "$1");
if (!matchGroup1.isEmpty())
{
char[] match_array = matchGroup1.toCharArray();
match_array[0] = Character.toLowerCase(match_array[0]);
match = new String(match_array);
}
sb.append(input.substring(oldEnd, start));
oldEnd = end;
sb.append(match);
}
sb.append(input.substring(oldEnd));
return sb.toString();
}
}
Демонстрационный вывод :
String foo;
Array keepThings;
List<? extends Reader> readers; // A silly comment
String.format("Hello World!"); /* No m_named vars here */
Редактировать 0 :
Поскольку знаки доллара ($
), микро (µ
) и фунт (£
) являются допустимыми символами для переменных имени Java, я отредактировал регулярное выражение.
Редактировать 1: Кажется, что допустимо много нелатинских символов (éùàçè
и т. Д.). Надеюсь, вам не придется обращаться с ними.
Редактировать 2: Я всего лишь человек! Так что знайте об ошибках, которые могут быть в коде! Сначала сделайте РЕЗЕРВНОЕ КОПИРОВАНИЕ!
Редактировать 3: Код улучшен. NPE был брошен, когда код содержит это: m_foo
. Они будут обработаны.