Иногда, в некоторых онлайн-компиляторах, которые вы, возможно, пробовали, вы получите эту ошибку, если не пишите public class [Classname]
, а просто class [Classname]
.
Как я уже сказал, вопреки распространенному мнению (не верьте всему, что говорят люди) соответствие вложенных скобок возможно с помощью регулярного выражения.
Недостатком использования является то, что вы можете использовать только до фиксированного уровня от гнездования. И для каждого дополнительного уровня, который вы хотите поддержать, ваше регулярное выражение будет больше и больше.
Но не верьте мне на слово. Позволь мне показать тебе. Регулярное выражение:
\([^()]*\)
Соответствует одному уровню . Для до двух уровней вам понадобится:
\(([^()]*|\([^()]*\))*\)
И так далее. Чтобы продолжать добавлять уровни, все, что вам нужно сделать, это изменить среднюю (вторую) [^()]*
часть на ([^()]*|\([^()]*\))*
( проверить три уровня здесь ). Как я сказал, он будет становиться все больше и больше.
Для вашего случая может быть достаточно двух уровней. Таким образом, код Java для него будет выглядеть следующим образом:
String fortranCode = "code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.";
String regex = "(\\w+)(\\(([^()]*|\\([^()]*\\))*\\))"; // (\w+)(\(([^()]*|\([^()]*\))*\))
System.out.println(fortranCode.replaceAll(regex, "__$1%array$2"));
Вход:
code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.
Выход:
code code __u%array(i, j, k) code code code code __u%array(i, j, k(1)) code code code u(i, j, __k%array(m(2))) should match this last 'u', but it doesnt.
В общем случае синтаксические анализаторы будут делать лучшую работу - вот почему люди так извиваются об этом. Но для простых приложений достаточно много регулярных выражений.
Примечание. Некоторые варианты regex поддерживают оператор вложенности R
(Java не работает, такие как PCRE-движки, как PHP и Perl), что позволяет вам для гнезда произвольного количества уровней. С ними вы могли бы сделать: \(([^()]|(?R))*\)
.
Пожалуйста, проверьте этот ответ, поскольку он в основном делает то, что вы пытаетесь сделать (короче говоря, это невозможно сделать с регулярными выражениями)
Отделите свою работу. Имеете регулярное выражение:
([a-z]+)\((.*)\)
Первая группа будет содержать идентификатор, второй - параметры. Затем выполните следующие действия:
private static final Pattern PATTERN = Pattern.compile("([a-z]+)\\((.*)\\)");
// ...
final Matcher m = Pattern.matcher(input);
if (!m.matches())
// No match! Deal with it.
// If match, then:
final String identifier = m.group(1);
final String params = m.group(2);
// Test if there is a paren
params.indexOf('(') != -1;
Замените [a-z]+
каким бы то ни было идентификатором в Fortran.