【问题标题】:regex Match string inside brackets which includes (or not includes) spaces正则表达式匹配包含(或不包含)空格的括号内的字符串
【发布时间】:2020-01-14 16:27:23
【问题描述】:

如何使用正则表达式捕获字符串,即 a) 在圆括号内(包括括号)和 b) 在括号内包含空格(或者 不包含空格) ,所以要捕获(test test), ( test), (test ) 但不是 (test).

我发现了一个类似的问题here 使用了表达式

\((?!\s)[^()]+(?<!\s)\)

但使用此先行/后行规则仅查找附加到括号的空格。如何修改它以查找括号内的每个空格?

提前谢谢你!

【问题讨论】:

  • 欢迎来到 SO!我们应该匹配( )(括号内只有空格)吗?如果是这样,/\([^)]* [^)]*\)/ 应该可以工作。
  • 感谢您的欢迎! :) ( ) 应该包括在内。对我来说/\([^)]* [^)]*\)/ 包括一个正则表达式测试器( test ) 但不包括(test test) 或( test) 或(test ),我不确定。
  • 这很奇怪——它对我来说很好用。您有正在使用的正则表达式测试器的链接吗?
  • 我的错,你是对的,VS Code 做到了。非常感谢!

标签: regex spaces brackets


【解决方案1】:

您可以使用/\([^)]* [^)]*\)/。这匹配 0 个或多个非右括号字符,后跟一个空格,后跟 0 个或多个非右括号字符。所以它将匹配 "( )" 和 "( )" 但不匹配 "()"。

const s = "() ( test) (test) (test ) (    ) ( ) ( test ) (t est)";
console.log([...s.matchAll(/\([^)]* [^)]*\)/g)]);

【讨论】:

  • 否定字符类会很乐意匹配更多的左括号,我理解这是不可取的。
  • 当括号不平衡时未指定,但无论哪种方式都很容易解释:/\([^()]* [^()]*\)/g。
【解决方案2】:

只需 \([^()]+\) 匹配括号之间的所有内容。这包括空格和除(换行符或)括号之外的任何其他字符。

(假设需要转义文字括号的正则表达式方言,并且 plus 匹配一个或多个重复。否定字符类是否匹配换行符也是方言特定的。)

如果(正如您在评论中所说)您至少需要一个空格,那么添加很容易。改写:匹配一个左括号字符,零个或多个非空格,非括号字符,一个空格,零个或多个非括号字符(空格也可以)直到右括号。

\([^ ()]* [^())*\)

【讨论】:

  • 谢谢,我认为问题在于我需要一个术语,当且仅当其中有空格时才能捕获括号。如果没有,则不应捕获它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2016-04-21
相关资源
最近更新 更多