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

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

Как заменить все пробелы между символами '[' и ']'?

Вот примертекст:

[HTTP Referrer] NVARCHAR(MAX) NULL, 
[Original URL] NVARCHAR(MAX) NULL, 
[Install App Store] NVARCHAR(MAX) NULL, 
[Match Type] NVARCHAR(128) NULL, 
[Contributor 1 Match Type] NVARCHAR(128) NULL, 
[Contributor 2 Match Type] NVARCHAR(128) NULL, 
[Contributor 3 Match Type] NVARCHAR(128) NULL, 
[Device Category] NVARCHAR(128) NULL, 
[Google Play Referrer] NVARCHAR(MAX) NULL, 
[Google Play Click Time] DATETIME2 NULL, 
[Google Play Install Begin Time] DATETIME2 NULL,
[CreatedOn] DATETIME2 NOT NULL,
[ModifiedOn] DATETIME2 NOT NULL,
[Retired] BIT NOT NULL

Как записать пробелы в скобках:

Желаемый вывод после замены совпадений регулярного выражения будет:

[HTTPReferrer] NVARCHAR(MAX) NULL, 
[OriginalURL] NVARCHAR(MAX) NULL, 
[InstallAppStore] NVARCHAR(MAX) NULL, 
[MatchType]NVARCHAR(128) NULL, 
[Contributor1MatchType] NVARCHAR(128) NULL, 
[Contributor2MatchType] NVARCHAR(128) NULL, 
[Contributor3MatchType] NVARCHAR(128) NULL, 
[DeviceCategory] NVARCHAR(128) NULL, 
[GooglePlayReferrer] NVARCHAR(MAX) NULL, 
[GooglePlayClickTime] DATETIME2 NULL, 
[GooglePlayInstallBeginTime] DATETIME2 NULL,
[CreatedOn] DATETIME2 NOT NULL,
[ModifiedOn] DATETIME2 NOT NULL,
[Retired] BIT NOT NULL

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

Это уже близко:

(?:\G(?!^)|\[)[^,]*?\K\s(?=[^\]]*)

Ответы [ 2 ]

0 голосов
/ 17 января 2019

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

t_STR=$(cat /tmp/example.txt); # slurp in the text
for i in $(seq $(echo "$t_STR"|grep -c ' '));do # how many spaces?
   t_STR="$(echo "$t_STR"|sed 's/\(\[.*\) \(.*\]\)/\1\2/g')"; # remove them
done
echo "$t_STR"

Если в каждой паре скобок есть только один пробел, то:
sed 's/\(\[.*\) \(.*\]\)/\1\2/' < /tmp/example.txt работает, (даже с / g sed удаляет только один пробел с этим регулярным выражением.)

Вы пытаетесь применить «удалить пробелы» к первой половине каждой строки, используя ']' в качестве разделителя, так что может быть более эффективно (в некоторых случаях) разделить строку на две части, а затем s/ //g за первую половину, прежде чем соединить два с ']' между ними.

0 голосов
/ 17 января 2019

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

\h+(?=[^]]*\])

Подробности RegEx:

  • \h+: сопоставить 1+ горизонтальных символов
  • (?=[^]]*\]): с нетерпением ожидаем, что у нас впереди ] без каких-либо ] между

RegEx Demo

В качестве альтернативы вы можете использовать подход, используя \G, как в вашем вопросе:

(?:\[|(?!^)\G)[^]\s]*\K\h+

RegEx Demo 2

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