Экстракт регулярного выражения между брекеткой [дубликат]

Иногда, в некоторых онлайн-компиляторах, которые вы, возможно, пробовали, вы получите эту ошибку, если не пишите public class [Classname], а просто class [Classname].

11
задан Li Dong 20 July 2013 в 06:40
поделиться

3 ответа

Как я уже сказал, вопреки распространенному мнению (не верьте всему, что говорят люди) соответствие вложенных скобок возможно с помощью регулярного выражения.

Недостатком использования является то, что вы можете использовать только до фиксированного уровня от гнездования. И для каждого дополнительного уровня, который вы хотите поддержать, ваше регулярное выражение будет больше и больше.

Но не верьте мне на слово. Позволь мне показать тебе. Регулярное выражение:

\([^()]*\)

Соответствует одному уровню . Для до двух уровней вам понадобится:

\(([^()]*|\([^()]*\))*\)

И так далее. Чтобы продолжать добавлять уровни, все, что вам нужно сделать, это изменить среднюю (вторую) [^()]* часть на ([^()]*|\([^()]*\))* ( проверить три уровня здесь ). Как я сказал, он будет становиться все больше и больше.

Ваша проблема:

Для вашего случая может быть достаточно двух уровней. Таким образом, код 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))*\).

22
ответ дан acdcjunior 4 September 2018 в 07:02
поделиться

Пожалуйста, проверьте этот ответ, поскольку он в основном делает то, что вы пытаетесь сделать (короче говоря, это невозможно сделать с регулярными выражениями)

Регулярное выражение для соответствия внешним скобкам

0
ответ дан Community 4 September 2018 в 07:02
поделиться

Отделите свою работу. Имеете регулярное выражение:

([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.

1
ответ дан fge 4 September 2018 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: