匹配正则表达式中的多个字母和特殊字符

时间:2019-07-11 23:27:46

标签: regex perl

我正在尝试在首字母缩写ADJ周围找到字符串。字符串如下所示:

·NOM·JJ·ADJ+CASE_DEF_GEN
·NOM·JJ·ADJ+CASE_DEF_ACC
·NOM·JJ·ADJ+CASE_INDEF_GEN
·NOM·DT+JJ·DET+ADJ+NSUFF_FEM_SG+CASE_DEF_GEN
·NOM·JJ·ADJ+CASE_INDEF_GEN
·NOM·JJ·ADJ+NSUFF_FEM_SG+CASE_INDEF_GEN
·NOM·DT+JJ·DET+ADJ+NSUFF_FEM_SG+CASE_DEF_ACC

到目前为止,我有这个: /[A-Z·\+#_]*?[·\+]ADJ[·\+][A-Z_·\+#]*?/g

但是它仅从字符串的开头到“ ADJ +” ·NOM·DT+JJ·DET+ADJ+之间匹配。

由于ADJ之后的其余字符串与ADJ之前的字符串开头具有相同的组成,因此我认为此/[A-Z·\+#_]*?[·\+]/g应该有效,但无效。 如何获取它以匹配其余字符串?

3 个答案:

答案 0 :(得分:2)

*?后面的+ADJ+量词对它后面的空字符串感到满意,因为?在匹配"the minimum number of times possible"之前和{{ 1}}是零倍。

因此删除*,这对其余的行也没有作用

?

答案 1 :(得分:1)

我的猜测是,您想确定字符串中是否有ADJ,如果是这样,也许我们可以将表达式简化为类似于以下内容的东西:

([A-Z·+#_]*)\bADJ\b([A-Z·+#_]*)

this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。

答案 2 :(得分:1)

最后删除?会匹配整个字符串,

/[A-Z·\+#_]*?[·\+]ADJ[·\+][A-Z_·\+#]*/g

我不确定您为什么需要在?中使用*