Совпадение строк между символами-разделителями - PullRequest
1 голос
/ 24 сентября 2019

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

‘verdichten’
‘verdichten, verstopfen’
‘dunkel, finster, wolkig’
‘fort sein, verloren sein, verloren’
‘von den Nymph ergriffen, verzückt, verrückt’
‘der sich halten kann, halten kann’

Результат, который я хотел бы получить:

[[verdichten]]
[[verdichten]], [[verstopfen]]
[[dunkel]], [[finster]], [[wolkig]]
[[fort sein]], [[verloren sein]], [[verloren]]
[[von den Nymph ergriffen]], [[verzückt]], [[verrückt]]
[[der sich halten kann]], [[halten kann]]

Он должен работать в Notepad ++ или EmEditor.

Я могу сопоставить с(‘)(.+?)(’) но я не могу найти способ заменить, как описано.

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Одним из вариантов может быть использование якоря \G и 2 групп захвата:

(?:‘|\G(?!^))([^,\r\n’]+)(?=[^\r\n’]*’)(?:(,\h*)|’)

По частям

  • (?: Группа без захвата
    • Матч
    • | Или
    • \G(?!^) Утверждение позиции в конце предыдущего матча, а не в начале
  • )* Закрыть группу без захвата
  • ( Захват группа 1
    • [^,\r\n’]+ Совпадение 1+ раз с любым символом, кроме , или новой строки
  • ) Близкая группа
  • (?=[^\r\n’]*’) Позитивный взгляд, утверждаем, что справа
  • (?: Группа без захвата
    • (,\h*)|’ Либо запишите запятую и 0+ горизонтальных пробельных символов в группу 2 , либо сопоставьте
  • ) Закрытьгруппа без захвата

Regex demo

При замене:

[[$1]]$2

Выход

[[verdichten]]
[[verdichten]], [[verstopfen]]
[[dunkel]], [[finster]], [[wolkig]]
[[fort sein]], [[verloren sein]], [[verloren]]
[[von den Nymph ergriffen]], [[verzückt]], [[verrückt]]
[[der sich halten kann]], [[halten kann]]
1 голос
/ 24 сентября 2019

С помощью @ Четвертого птичьего ответа, вот регулярное выражение, которое не будет включать пробелы в концах матчей:

(?:‘|\s*(?!^))([^,\r\n’]+)(?=[^\r\n’]*’)(?:(,)|’)

Замена на [[$1]]$2

даст обрезанные токены:

[[verdichten]],[[verstopfen]]
[[dunkel]],[[finster]],[[wolkig]]
[[fort sein]],[[verloren sein]],[[verloren]]
[[von den Nymph ergriffen]],[[verzückt]],[[verrückt]]
[[der sich halten kann]],[[halten kann]]

демо

Редактировать: Для приведенного вами примера test context ‘verdichten’ test context вы можете использовать:

(?:‘|\G\s*(?!^))([^,\r\n’]+)(?=[^\r\n’]*’)(?:(,)|’)

...