Регулярное выражение для сравнения - PullRequest
0 голосов
/ 05 апреля 2019

Для университетского задания мне нужно сопоставить циклы из ввода с регулярным выражением, поэтому я хочу написать регулярное выражение для его распознавания.

Я пытался использовать регулярное выражение, но оно ничего не соответствует:

for\((\w*\s+\w+\s*\=\s*\d+\s*)?\;(\s*\w+\s*\W+\d+\s*)\;(\s*\w+\W+)\)\{ . \}

это регулярное выражение, которое я использовал.

for(int i=1;i<=10;i++){  
System.out.println(i);  
} 

и это что-то вроде того, что я хочу сопоставить.

1 Ответ

1 голос
/ 05 апреля 2019

Как и предполагали другие, это не подходящее задание для регулярных выражений; Вас следует использовать парсер .

При этом, если вы должны использовать регулярные выражения и , вы только заботитесь о соответствии цикла for в том формате, который вы указали , вы можете заменить часть \{ . \} чем-то вроде \{[\S\s]+\}, чтобы успешно соответствовать телу.

Вот полный шаблон:

for\s*\((\w*\s+\w+\s*\=\s*\d+\s*)?\;(\s*\w+\s*\W+\d+\s*)?\;(\s*\w+\W+)?\)\s*\{[\S\s]+?\}

Regex101 demo .

Я внес в него некоторые дополнительные изменения. Например, разрешено больше пробелов, где это необходимо, и 2-я и 3-я группы необязательны, , поскольку каждая из инициализации, условия и обновления (приращение / уменьшение) действительно являются необязательными в Java и соответствовать бесконечному циклу, а также. Не стесняйтесь сохранять или игнорировать эти изменения в зависимости от ваших требований.

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

// The update/increment may use a different operator.
for (int i = 1; i <= 10; i += 1) { }

// The condition can be any expression that evaluates to boolean.
for (int i = 1; i * 2 <= 10; i++) { }

// A for loop can have no braces.
for (int i = 1; i <= 10; i++)           
    System.out.println(i);

// Etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...