【问题标题】:How to handle optional groups in regex and remove trailing spaces of result如何处理正则表达式中的可选组并删除结果的尾随空格
【发布时间】:2019-07-09 19:07:11
【问题描述】:

我正在尝试提取字符串和可选括号的内容,但我不知道如何处理可选括号:

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

我正在尝试使用正则表达式/(.*)\((.*?)\)/gm,但这不会处理前两行。对于前两行,第二组的结果为空。 我也想去掉文本结果的尾随空格。

第一组的预期结果应该是lorem ipsumlorem, ipsum,第二组的预期结果应该是X123/ X.12 / X1

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

【问题讨论】:

  • 您希望匹配输入的哪些部分?你能提供预期的结果吗?
  • 您可以使用[^()] 查找所有不是括号的内容
  • @MonkeyZeus 更新了帖子

标签: javascript regex


【解决方案1】:

您可以使用正则表达式/^(.+?)\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));

【讨论】:

  • 只需要括号的内容。是否可以从结果中删除括号?
  • 当然,只需交换文字括号和捕获组括号即可。更新有效果吗?
【解决方案2】:

我的猜测是,可能是这个表达式,或者那个的修改版本,

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

可能会起作用。

DEMO

【讨论】:

  • 第一个匹配的结果是三行。在这个例子中应该有六个匹配项
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多