Как обработать необязательные группы в регулярном выражении и удалить конечные пробелы результата - PullRequest
2 голосов
/ 09 июля 2019

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

lorem, ipsum
lorem ipsum
lorem, ipsum (X123), 
lorem ipsum (X.12), 
lorem ipsum    (X.12), 
lorem ipsum (X1)

Я пытаюсь сделать это с помощью регулярного выражения /(.*)\((.*?)\)/gm, но это не будет обрабатывать первые две строки.Для первых двух строк результат для второй группы пуст.Также я хотел бы избавиться от конечных пробелов в текстовом результате.

Ожидаемый результат должен быть lorem ipsum или lorem, ipsum для первой группы и X123 / X.12 / X1для второй группы.

https://regex101.com/r/ZcCLCL/2

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы можете использовать регулярное выражение /^(.+?)\s*(?:\((.+?)\))?[,\s]*$/.

Объяснение:

^   beginning of line
 (.+?)   lazily capture one or more characters
      \s*   zero or more spaces
         (?:   begin unnamed capturing group
            \(   literal parenthesis
              (.+?)   lazily capture one or more of any character
                   \)   literal parenthesis
                     )?   end unnamed capturing group and make it optional
                       [,\s]*   zero or more spaces or commas
                             $   end of line

const pattern = /^(.+?)\s*(?:\((.+?)\))?[,\s]*$/gm;

const s= `lorem, ipsum
lorem ipsum
lorem, ipsum (X123), 
lorem ipsum (X.12), 
lorem ipsum    (X.12), 
lorem ipsum (X1)`;

for (let m; m = pattern.exec(s); console.log(m));
1 голос
/ 09 июля 2019

Я предполагаю, что, возможно, это выражение или измененная версия

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

могут работать.

DEMO

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