Я ищу способ сопоставления идентификатора C с последующим двойным подчеркиванием.Но вот в чем дело: мне нужно, чтобы он не был жадным, если идентификатор заканчивается серией подчеркиваний.
Я почти получил его с помощью ^([_A-Za-z][_A-Za-z0-9]*?)__
, но есть хитрый набор случаев, когда идентификатор может заканчиваться насерия символов подчеркивания:
string expected identifier
abcd0__ abcd0
abcd0___ abcd0_
abcd0____ abcd0__
abcd__0__ abcd
abcd___0__ abcd_
abcd____0__ abcd__
Есть ли способ, которым я могу изменить регулярное выражение для получения ожидаемого совпадения группы, указанного выше?
Ниже приведена тестовая программа, которая печатает неверный вывод:
abcd0__ -> match is abcd0
abcd0___ -> match is abcd0
abcd0____ -> match is abcd0
abcd__0__ -> match is abcd
abcd___0__ -> match is abcd
abcd____0__ -> match is abcd
Regex3.java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex3 {
final static private Pattern pattern =
Pattern.compile("^([_A-Za-z][_A-Za-z0-9]*?)__");
static public void main(String[] args)
{
String[] items = {
"abcd0__",
"abcd0___",
"abcd0____",
"abcd__0__",
"abcd___0__"
"abcd____0__"
};
for (String item : items)
test(item);
}
private static void test(String item) {
Matcher m = pattern.matcher(item);
if (m.find())
{
System.out.println(item+" -> match is "+m.group(1));
}
else
{
System.out.println(item+" -> no match");
}
}
}