Regex найти все запятые между двумя словами - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь очистить большой файл .csv, содержащий много слов, разделенных запятыми, которые мне нужны для объединения частей.Поэтому у меня есть подраздел, в котором я хочу поменять все запятые на косые.Допустим, мой файл содержит этот текст:

Foo,bar,spam,eggs,extra,parts,spoon,eggs,sudo,test,example,blah,pool

Я хочу выделить все запятые между строкой уникальных слов и бла.Идея состоит в том, чтобы затем заменить запятые на косые черты (используя поиск и замену), так что я получаю следующий результат:

Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool

Согласно вводу @EganWolf: Как включить словав поиске, но исключить их из выбора (для уникальных слов), и как мне тогда сопоставить только запятые между словами?

До сих пор мне удалось выделить только текст между уникальными словами, включаяих: bar,.*,blah, bar:*, *,blah, (bar:.+?,blah)*,*\2

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

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Используя Блокнот ++, вы можете:

  • Ctrl + H
  • Найти что: (?:\bbar,|\G(?!^))\K([^,]*),(?=.+\bblah\b)
  • Заменить на: $1/
  • check Обернуть вокруг
  • check Регулярное выражение
  • UNCHECK . matches newline
  • Заменить все

Объяснение:

(?:             # start non capture group
    \bbar,      # word boundary then bar then a comma
  |             # OR
    \G          # restart from last match position
    (?!^)       # negative lookahead, make sure not followed by beginning of line
)               # end group
\K              # forget all we've seen until this position
([^,]*)         # group 1, 0 or more non comma
,               # a comma
(?=             # positive lookahead
    .+          # 1 or more any character but newlie
    \bblah\b    # word boundary, blah, word boundary
)               # end lookahead

Результат для заданногоПример:

Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool

Снимок экрана:

enter image description here

1 голос
/ 09 марта 2019

Следующее регулярное выражение захватит минимально необходимый текст для доступа к нужным запятым:

(?<=bar,)(.*?(,))*(?=.*?,blah)

См. Regex Demo .

Если вы хотите заменить запятые, вам нужно будет заменить все в группе захвата 2. Группа захвата 0 содержит все совпадения.

Альтернативным подходом было бы разделить вашу строку запятой, чтобы создать массив слов. Затем соедините слова между bar и blah, используя /, и добавьте другие слова, соединенные ,.

Вот пример разделения и объединения в PowerShell:

$a = "Foo,bar,spam,eggs,extra,parts,spoon,eggs,sudo,test,example,blah,pool"
$split = $a -split ","
$slashBegin = $split.indexof("bar")+1
$commaEnd = $split.indexof("blah")-1
$str1 = $split[0..($slashbegin-1)] -join "," 
$str2 = $split[($slashbegin)..$commaend] -join "/"
$str3 = $split[($commaend+1)..$split.count] -join ","
@($str1,$str2,$str3) -join ","

Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool

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

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