Как я могу использовать замену регулярного выражения, чтобы окружить каждый символ в согласованной группе - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь определить замену регулярного выражения, которая может преобразовывать строку в сопоставленной группе и заключать каждый символ в кавычки.

Например, учитывая следующее:

#define TEST_1  "Test String"
#define TEST_2  "Another Test String"

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

char TEST_1[] = { 'T','e','s','t',' ','S','t','r','i','n','g' };
char TEST_2[] = { 'A','n','o','t','h','e','r',' ','T','e','s','t',' ','S','t','r','i','n','g' };

Есть ли способ сделать это в регулярном выражении, в частности в регулярном выражении в CMake?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Вот пример того, как это сделать

set( S "#define TEST_1  \"Test String\"" )             # Set string to beging with
string(REGEX REPLACE "#define[\t ]*([a-zA-Z0-9_]+)" "char \\1[] = { " S ${S} ) # "#define TEST_1" -> "char TEST_1[] = {"
string(REGEX MATCH "\"([^\"]+)\"" RESULT ${S})         # get characters in string
set(RESULT ${CMAKE_MATCH_1})                           # RESULT = Test String
string(REGEX REPLACE "(.)" "'\\1'," RESULT ${RESULT} ) # Replace each character with 'x',
string(LENGTH ${RESULT} iLength)                       # Calculate length
math(EXPR iLength "${iLength} - 1")                    # Decrease length with 1
string(SUBSTRING ${RESULT} 0 ${iLength} RESULT)        # Remove last comma

string(FIND ${S} "{" iPosition)                        # Find {
math(EXPR iPosition "${iPosition} + 1")                # Increase position with 1
string(SUBSTRING ${S} 0 "${iPosition}" S)              # Get substring
string(APPEND FINAL ${S} " " ${RESULT} " };"  )        # Build final string
message( STATUS "FINAL = ${FINAL}" )                   # Print final string
0 голосов
/ 29 мая 2020

Я не уверен, что можно манипулировать всей строкой, как вы просили, с помощью одного вызова CMake, но вот одно решение, которое требует нескольких вызовов.

Здесь мы разбиваем начальную строку на двойную -цифры:

#define TEST_1  "Test String"

на два раздела: #define TEST_1 и Test String. Затем мы вызвали string(REGEX REPLACE ...) для каждого раздела строки, чтобы управлять им соответствующим образом. Затем мы объединили две части обратно вместе в конце:

# Define an initial string, for testing.
set(MYSTRING "#define TEST_1  \"Test String\"")
message("${MYSTRING}")

# Split the string into the unquoted and quoted portions.
string(REPLACE "\"" ";" MYSTRING_LIST ${MYSTRING})
list(GET MYSTRING_LIST 0 MYSTRING_BEGIN)
list(GET MYSTRING_LIST 1 MYSTRING_QUOTED)

# Perform regex replace to match the '#define TEST_N  ' portion, and
# replace it with 'char TEST_N[] = { '.
string(REGEX REPLACE "^#define TEST_([0-9]+)([ \t\r\n]*)" "char TEST_\\1[] = { " STR_OUTPUT_BEGIN ${MYSTRING_BEGIN})
message("${STR_OUTPUT_BEGIN}")

# Perform regex replace on the quoted string portion, matching every
# character in the string, single-quoting and comma-separating each.
string(REGEX REPLACE "(.)" "'\\1'," STR_OUTPUT_QUOTED ${MYSTRING_QUOTED})
# Remove the trailing comma appended in the previous regex-replace.
string(REGEX REPLACE ",$" "" STR_OUTPUT_QUOTED2 ${STR_OUTPUT_QUOTED})
message("${STR_OUTPUT_QUOTED2}")

# Concatenate them back together, appending the ' };' to the end.
string(CONCAT FINAL_STRING ${STR_OUTPUT_BEGIN} ${STR_OUTPUT_QUOTED2} " };")
message("${FINAL_STRING}")

Итак, вы можете видеть, что происходит, это печатает:

#define TEST_1  "Test String"
char TEST_1[] = { 
'T','e','s','t',' ','S','t','r','i','n','g'
char TEST_1[] = { 'T','e','s','t',' ','S','t','r','i','n','g' };

Это должно быть довольно легко logi c в CMake function и вызовите функцию в al oop, если вам нужно обработать несколько строк, как указано в вашем примере.

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