非捕获组仍在捕获

时间:2015-04-27 14:51:36

标签: regex string capture

我试图制作一个与_TAG(_DT,_NN等)部分按照它们出现的顺序匹配句子的所有以下变体的正则表达式:

Her_PP$|DT noun_NN|NNS a_PP$|DT noun_NN|NNS
Her_PP$|DT adj_JJ noun_NN|NNS a_PP$|DT noun_NN|NNS
Her_PP$|DT noun_NN|NNS a_PP$|DT adj_JJ noun_NN|NNS
Her_PP$|DT adj_JJ noun_NN|NNS a_PP$|DT adj_JJ noun_NN|NNS

这是原始文本的显示方式,我只想突出显示匹配项。竖条|是指"或"在上下文中,所以请将它包含在正则表达式中,如正常"或。"

正如你所看到的,每一个的基本骨架都是Her_PP $ | DT noun_NN | NNS a_PP $ | DT noun_NN | NNS,其中散布着一些_JJ碎片。我想要一个正则表达式来捕获所有这些,但我似乎无法使用可选的字符串来工作。

_PP$|DT并不总是跟_JJ后面,所以我想将_JJ设为可选,但每次都找不到_PP$|DT _NN_PP$|DT _JJ _NN. 这是我的字符串:

(\w+_(?:PP\$|DT)(?:\w+_JJ)(\w+__(?:NN|NNS)))   

对于那些关心的人来说,_PP$等是附加在单词末尾的词性标记(例如,NN表示"名词"所以你可能会看到&#34 34; dog_NN&#34)。

我很抱歉我是一个绝对的初学者,所以请耐心等待! :)

3 个答案:

答案 0 :(得分:0)

(?:xyz)表示匹配xyz但不捕获它。

如果您想要制作可选内容,则必须将?添加到该论坛。

在你的情况下..正则表达式将是

((\w+_(PP\$|DT)(\s\w+_JJ)*?(\s\w+_(NN|NNS))\s?){2})

答案 1 :(得分:0)

您可以使用前瞻来测试各种条件:

^(?=.*_PP\$|DT)(?=(?:.*_JJ)?)

^                               start of string
    ^^^^                        First condition
                  ^^^^^         Optional second condition

然后将所有内容捕获到_NN:

^(?=_PP\$\|DT)(?=(?:.*_JJ)?)(.*_NN)

Demo

答案 2 :(得分:0)

你的正则表达式不是很糟糕,只是逃避管道|,因为它是正则表达式中的特殊字符:

(\w+_(?:PP\$\|DT)(?:\w+_JJ)(\w+__(?:NN\|NNS)))
//   here __^              and here __^