Удалить внешние скобки - PullRequest
2 голосов
/ 10 июня 2019

У меня проблема при удалении внешних скобок из строки с использованием GREL.То, что я пытаюсь сделать, это просто удалить внешние скобки, а все остальные скобки должны быть сохранены.Ниже приведено то, что я пытаюсь сделать с помощью регулярных выражений -

value.split(/(abc+/)

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

Foo ( test1 test2 ) => Foo test1 test2
Bar ( test1 t3() test2 ) => Bar test1 t3() test2
Baz ((("Fdsfds"))) => Baz (("Fdsfds"))

Буду признателен за любую помощь.

Ответы [ 4 ]

3 голосов
/ 10 июня 2019

Одним из вариантов может быть использование группы захвата, а при замене использовать первую группу захвата.

Обратите внимание, что это не учитывает сбалансированные скобки.

Соответствует внешней скобке, затем захватывает в группе то, что находится внутри и снова соответствует внешней круглой скобке.

Внутри группы захвата находится чередование, которое не соответствует () или открытию до закрывающей скобки.

\((\(*(?:[^)(]*|\([^)]*\))*\)*)\)

Пояснение

  • \( Соответствует внешней круглой скобке (
  • ( Группа захвата - \(* Соответствует 0+ раз (
    • (?: Группа без захвата
      • [^)(]* Совпадение 0+ раз, а не ( или )
      • | Или
      • \([^)]*\) Совпадение с ( до следующего ) закрывающая скобка
    • )* Закрыть группу без захвата и повторить 0+ раз
    • \)* Соответствовать 0+ раззакрывающая скобка
  • ) Закрыть группу захвата
  • \) Соответствиевнешняя закрывающая скобка

Regex demo

2 голосов
/ 10 июня 2019

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

Регулярное выражение PCRE:

^[^(]*\K\(|\)(?!.*\).*)

демо: https://regex101.com/r/lj0Qbl/1/

Регулярное выражение ECMA:

(?<!.*\(.*)\(|\)(?!.*\).*)

демо: https://regex101.com/r/g8XbjI/1/

для обоих:

Введите:

Foo ( test1 test2 ) bob
Bar ( test1 t3() test2 ) bob
Baz ((("Fdsfds"))) bob

Выход:

Foo  test1 test2  bob
Bar  test1 t3() test2  bob
Baz (("Fdsfds")) bob
1 голос
/ 10 июня 2019

Есть несколько способов сделать это с помощью GREL.Если вы хотите использовать регулярные выражения, тогда в GREL я бы порекомендовал объединить это с функцией GREL match:

value.match(/(.*?)\((.*)\)(.*)/).join("")

Обратите внимание, что в этом выражении предполагается, что в ячейке есть хотя бы одна пара скобок -ячейки, которые не имеют круглых или только открывающих или только закрывающих скобок, приведут к ошибке - однако вы можете использовать опцию «при ошибке сохранить оригинал» (которая используется по умолчанию) при выполнении преобразования ячейки, чтобы сохранить исходное значение в этихслучаи

1 голос
/ 10 июня 2019

Если все наши входные данные аналогичны тем, которые перечислены в вопросе, это выражение может работать:

(.+?)\s+\((\s+)?(.*)(\s+)?\)

и мы заменим его на $1 $3.

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...