Регулярное выражение для поиска имени абзаца в коболе - PullRequest
0 голосов
/ 05 января 2012

Мне нужно регулярное выражение , чтобы соответствовать имени абзаца при чтении файла COBOL в Java.Ниже приведен пример для имени абзаца ..

9800-WRITE-SCREEN-A.
C70-WRITE-ABFGRPPARM.
FGH0-REWRITE-ABFGRPPARM. 
8100-FILE-ERROR.

спасибо

Ответы [ 3 ]

4 голосов
/ 05 января 2012

Многие думают, что поскольку КОБОЛ стар, это должно быть просто ... Плохое предположение. по факту Разбор COBOL совсем не тривиален. Вы можете подумать, сканируя программу на COBOL, чтобы идентифицировать только PARAGRAPH имена не должны требовать полноценного парсера --- но он будет иметь свой вызовы. Одно только регулярное выражение не подходит для этой задачи.

Вот несколько советов и вещей, о которых следует знать:

  • PARAGRAPH имена могут встречаться в других местах, кроме PROCEDURE DIVISION. Основан на имена, приведенные в вашем вопросе, я подозреваю, что вы должны только проанализировать PROCEDURE DIVISION программы. Это последний отдел традиционного Программа COBOL (при условии, что программа не содержит вложенных программ). Если вам нужно проанализировать OO COBOL или вложенные программы COBOL, вам понадобится более продвинутые методы разбора чем может предоставить Regex.
  • Ограничьте ваш анализ текстовыми файлами, содержащими отдельные программы. Можно закодировать несколько независимых программ в одном источнике, но обычно это не так готово, поэтому поймите, что вы, вероятно, не справитесь с этим изящно.
  • Для программ COBOL фиксированного формата (кодирование старого стиля) вы можете положиться на то, что PARAGRAPH имена начнутся где-то между столбцами с 8 по 11.
  • Для фиксированного формата COBOL вам нужно игнорировать любой текст, появляющийся в столбцах с 1 по 6 и от столбца 73 до конца строки.
  • Для фиксированного формата COBOL - любая строка, содержащая символ, отличный от пробела или дефиса в столбце 7 следует игнорировать (это строка комментария или отладки).
  • Если программа содержит директивы COPY или REPLACE в PROCEDURE DIVISION, Ваш анализ будет неполным и / или неточным. COPY потенциально может ввести дополнительный исходный код, содержащий названия абзацев и REPLACE директива может изменять имена последующих абзацев во время манипулирования текстом фаза компиляции (то есть скомпилированная программа может иметь имена, отличные от тот, который вы обнаружите). Это не обычная практика, но вы должны знать о ней.
  • Строки продолжения могут действительно испортить простой текстовый сканер, потому что один COBOL Слово (например, название абзаца) может быть разбито на несколько строк исходного текста. Однако в в случае имен абзацев для них не является распространенным явлением линии.
  • Символы запятой (",") и точки с запятой (";") являются "шумом" и могут появляться почти везде, где может быть место (по крайней мере, в разделе ПРОЦЕДУРА). Вы может заменить их пробелами для упрощения последующий анализ.
  • Цитированный текст. КОБОЛ имеет несколько интересных соглашений о цитировании, особенно когда Текст в кавычках занимает несколько строк исходного текста. Правила цитирования и продолжения текста для кобола не похожи ни на какие другие язык, с которым вы, возможно, знакомы, - и создает настоящие головные боли при разборе. я не даже собираюсь начать объяснять их здесь!

Как распознать имя PARAGRAPH в разделе «Процедуры» программы COBOL? Просто, просто ищите одиночные «слова», разделенные точками («.»). Название абзаца одно слово (может содержать дефисы, буквенные и / или цифровые символы) и всегда предшествует период и сопровождается периодом. Могут (или не могут быть) пробелы до или после каждый из периодов.

Теперь мне кажется, что если вы хотите идентифицировать PARAGRAPH имена, вы, вероятно, хотите определить SECTION имена тоже. SECTION имя похоже на PARAGRAPH имя, за исключением того, что за ним следует обязательное зарезервированное слово SECTION и, необязательно, PRIORITY NUMBER. PRIORITY NUMBER больше не используется (на самом деле устарела), поэтому вам, возможно, не придется иметь с ними дело.

Несколько некорректный, но разумный процесс определения названий абзацев COBOL

Это не одно регулярное выражение, а процесс, включающий несколько регулярных выражений и / или текстовые манипуляции.

  • Предположим, фиксированный формат COBOL
  • Исключить весь цитируемый текст. Не сложное предложение для простого текста, нокогда задействованы линии продолжения, становится довольно сложно.Если задействованы директивы COPY / REPLACE - забудьте об этом!
  • Исключите строки комментариев (т.е. столбец 7 содержит звездочку)
  • Удалите столбцы с 1 по 7 и 73 до конца строки
  • Удалить весь текст перед словами "PROCEDURE DIVISION"
  • Заменить все вхождения запятой и точки с запятой одним пробелом
  • Извлечь весь текст между точками (".")
  • Если извлеченный текст содержит одно слово, то это имя PARAGRAPH.
  • Если извлеченный текст содержит два слова, а второе слово - «РАЗДЕЛ», то первоеслово - это имя SECTION.

Вышеприведенное не является доказательством недосказанности, но должно быть достаточно для определения названий абзацев и разделов в большинстве программ на языке COBOL "Разнообразие садов".Желаю тебе удачи.

1 голос
/ 05 января 2012
"^[ ]{7,10}([-\\w]+)"

Имена абзацев начинаются в столбцах 8-11.$ 1 будет именем.

0 голосов
/ 12 марта 2014

Некоторые правила:

  1. Имена абзацев начинаются в области A (столбцы 8-11).
  2. Может содержать символы, цифры или дефисы.
  3. Заканчивается точкой (.).
  4. Без пробела.

Regex = ^ [] {7,10} ([- \ w] + \. \ N)

...