1

以下是我的文字 -

Lorem Ipsum 来自西塞罗(Cicero)写于公元前 45 年的“de Finibus Bonorum et Malorum”(善与恶的极端)第 1.10.32 和 1.10.33 节。这也应该匹配 () 和 ()。

我试图在其中匹配文本 -

  • (善恶之极)
  • ()
  • ( )

我的正则表达式 -\(.\)这不起作用。

我还尝试\(*\)了匹配(), )of( ))of (The Extremes of Good and Evil)。让我知道我在这里做错了什么。

4

3 回答 3

3

您需要一个量词*来匹配括号内的零个或多个字符。也使它变得懒惰?,因此只要到达第一个右括号就停止\(.*?\)

var s = 'Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This should also match () and ( ).'

console.log(
  s.match(/\(.*?\)/g)
)

于 2017-09-24T19:18:53.200 回答
2

我的正则表达式 - \(.\) 不起作用。

这与一对括号之间正好有一个其他字符相匹配。

我还尝试了 \(*\),它与 ​​() 的 ()、) 和 (善恶的极端) 的 () 匹配。让我知道我在这里做错了什么。

在那里,您匹配任何数字,包括零个左括号(因为通配符适用于左括号),然后是右括号。

你要这个:

\([^)]*\)

那是:

  • 一个左括号,然后是
  • 除右括号外的零个或多个字符,后跟
  • 右括号。

您需要以某种方式从中间的字符中排除右括号,否则您将从第一个左括号到最后一个右括号的所有内容作为单个匹配项进行匹配。

于 2017-09-24T19:21:15.067 回答
0

这应该与您正在寻找的完全匹配。在每行的非全局级别上使用它解析时 - 它将解析括号。

(?:\()  #Non-Capture Group Parenthesis - for advanced submatching regex.
(       # Start Capture Group 1
 (?!\)) # Negative Lookahead
   .*?  # Match all characters except line break + Lazy
)?      # End Capture Group 1 + Lazy (empty parenthesis)
(?:\))  #Non-Capture Group Parenthesis - for advanced submatching regex.

见下文...

var s = 'Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This should also match () and ( ).'

console.log(
  s.match(/(?:\()((?!\)).*?)?(?:\))/g)
)

//CONSOLE OUTPUT
(3) ["(The Extremes of Good and Evil)", "()", "( )"]
0: "(The Extremes of Good and Evil)"
1: "()"
2: "( )"
length: 3
于 2017-09-24T19:30:38.037 回答