Регулярное выражение для интерпретации формата smtlib2
Я пытаюсь вычислить регулярное выражение, которое могло бы соответствовать результатам программы, которая выводит в формате smtlib. В основном мои данные имеют вид:
(define-fun X_1 () Int
281)
(define-fun X_71 () Int
104)
(define-fun X_90 () Int
21)
(define-fun X_54 () Int
250)
etc.
Можно ли написать выражение, которое соответствует:
X_1 (...) 281
X_71 (...) 104
X_90 (...) 21
etc.
Мой текущий подход - найти отдельные случаи, используя
\(define-fun[\w\s]+\)
, затем для каждого случая удалите
(define-fun
,
Int
,
()
а также
)
, а затем прочитайте данные, так как все, что осталось, это что-то вроде
1 281
,
71 104
Мне просто интересно, есть ли более элегантный способ сделать это?
1 ответ
Захватите эти подстроки:
\(define-fun\s+(\S+).*\n\s*(\d+)\)
См. Доказательство регулярного выражения .
ОБЪЯСНЕНИЕ
--------------------------------------------------------------------------------
\( '('
--------------------------------------------------------------------------------
define-fun 'define-fun'
--------------------------------------------------------------------------------
\s+ whitespace (\n, \r, \t, \f, and " ") (1 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t, \f,
and " ") (1 or more times (matching the
most amount possible))
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
\n '\n' (newline)
--------------------------------------------------------------------------------
\s* whitespace (\n, \r, \t, \f, and " ") (0 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
( group and capture to \2:
--------------------------------------------------------------------------------
\d+ digits (0-9) (1 or more times (matching
the most amount possible))
--------------------------------------------------------------------------------
) end of \2
--------------------------------------------------------------------------------
\) ')'