1

考虑以下文本:

aas(  I)f df (as)(dfdsf)(adf).dgdf(sfg).(dfdf) asdfsdf dsfa(asd #54 54 !fa.) sdf

我想检索括号之间的文本,但相邻的括号应该被视为一个单元。我怎样才能做到这一点?

对于上面的示例,所需的输出是:

  • ( 一世)
  • (as)(dfdsf)(adf)
  • (sfg).(dfdf)
  • (asd #54 54 !fa.)
4

4 回答 4

1

试试[^(](\([^()]+([)](^[[:alnum:]]*)?[(][^()]+)*\))[^)]。捕获组 1 是您想要的。

此表达式假定除括号外的每种字符都可能出现在括号之间的文本中,并且它不会匹配带有嵌套括号的部分。

于 2013-03-15T14:03:13.433 回答
1

我会去:/(?:\(\w+\)(?:\.(?=\())?)+/g

  • \(\w+\)匹配文字大括号内的 a-zA-Z0-9_
  • (?:\.(?=\())?.仅当后面跟着另一个左大括号时才捕获文字
  • 整个东西被包裹起来(?:)+以将相邻的捕获连接在一起
var str = "aas(I)f df (asdfdsf)(adf).dgdf(sfg).(dfdf) asdfsdf dsfa(asdfa) sdf";
str.match(/(?:\(\w+\)(?:\.(?=\())?)+/g);
// -> ["(I)", "(asdfdsf)(adf)", "(sfg).(dfdf)", "(asdfa)"]
于 2013-03-15T14:03:15.617 回答
1

假设

  • 没有嵌套(),也没有逃逸()
  • 括号与.字符链接在一起,或者彼此相邻(不允许灵活的间距)。
  • (a)(b).(c)被认为是一个单一的令牌(.是可选的)。

解决方案

下面的正则表达式将与全局匹配(全部匹配)功能一起使用。

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

请自行添加分隔符。

演示

解释

正则表达式的分解(间距无关紧要)。之后和包括#是注释,而不是正则表达式的一部分。

\(             # Literal (
[^)]*          # Match 0 or more characters that are not )
\)             # Literal ). These first 3 lines match an instance of wrapped text
(?:            # Non-capturing group
  \.?          # Optional literal .
  \([^)]*\)    # Match another instance of wrapped text
)*             # The whole group is repeated 0 or more times
于 2013-03-15T14:48:34.387 回答
-2

这个应该可以解决问题:

\([A-Za-z0-9]+\)
于 2013-03-15T14:01:34.427 回答