Регулярное выражение, разделенное строкой, сохраняющей пробел, в фигурных скобках - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть строка, которая выглядит следующим образом

arg1 {0 1} arg2 {5 87} string {with space} ar3 1

Она разделена пробелами, но строка может также содержать пробелы, поэтому это вызывает проблемы для строк с пробелами.Мне все еще нужно разбить эту строку, но я бы не хотел разбивать строку, содержащуюся в фигурных скобках и с префиксом ключевого слова string.Это означает, что приведенная выше строка должна быть разделена следующим образом

arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1

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

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

шаг 1: разделить пробелом, как обычно, получить массив

шаг 2: пройти по массиву, если найдем {[a-zA-Z]+, объединить следующий элемент с пробелом и удалить следующий элемент.

тогда вы получили то, что хотели.следующая команда awk показана в качестве примера.

echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1"|awk '{split($0,a); 
for(i=1;i<=length(a);i++){
  if(a[i]~/{[a-zA-Z]+/){a[i]=a[i]" "a[i+1];delete a[i+1];} 
  if(a[i])print a[i];} }'

arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1

== update ==

OK, на основании вашего комментария это тоже работает:

step1, найдите те строки, которыеВы не хотите «разделять», заменить на специальную строку.и важно сохранить найденные строки в другой массив.Пример в примере grep:

echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|grep -E -o '\{([a-zA-Z]+\s*)*\}'

        {with space}
        {abc def}
        {xyz zyx}

after replace:xxxxxxxxx as the special string

kent$  echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|sed -r 's#\{([a-zA-Z]+\s*)*\}#xxxxxxxxx#g'

arg1 {0 1} arg2 {5 87} string xxxxxxxxx ar3 1 xxxxxxxxx xxxxxxxxx

step2, делим split

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

0 голосов
/ 19 сентября 2011

Я не знаю QRegExp, поэтому я не знаю, имеет ли он возможности lookaround .Если это так, вы можете попробовать разбить на что-то вроде этого:

(?<!(^|})[^{]*\bstring\s{[^}]*)\s

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

Вы также можете использовать упрощенную версию: (?<!\bstring\s{[^}]*)\s, хотя на это будут влиять такие странные вещи, как foo {string {bar qux}}.

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