RegEx匹配一些包装文本

时间:2013-03-15 13:57:54

标签: regex text pcre

考虑以下文字:

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

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

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

  • (I)
  • (如)(dfdsf)(ADF)
  • (SFG)。(dfdf)
  • (asd#54 54!fa。)

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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)"]

答案 2 :(得分:1)

假设

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

解决方案

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

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

请自行添加分隔符。

DEMO

解释

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

\(             # 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

答案 3 :(得分:-2)

这个应该可以解决问题:

\([A-Za-z0-9]+\)