regex 如何在同一行中将两个单词算作1

bvn4nwqk  于 2023-05-08  发布在  其他
关注(0)|答案(4)|浏览(106)

在我得到的文本文件中,每个句子都用特定的类型表示,例如:对比度
对比句子可以用标签“CONTRAST”或“CONTR”或“WEAKCONTR”表示。例如:
IMPSENT_CONTRAST_维斯(以这种方式研究网络有助于
确定个人学习的人,在哪里
在理解_MD:+中的_MD:+冲突可能产生,并且
情境因素影响学习。)
所以我用下面的表达式来计算这些:/(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\())/g,它工作得很好。
现在的问题是一些句子用一个以上的对比标签来表达,比如CONTR和WEAKCONTR。例如:
IMPSENT_CONTRAST_EMPH_WEAKCONTR_维斯(以这种方式研究_MD:+网络可以帮助识别_MD:+个人学习的人,理解_MD:+中的冲突可能源于何处,以及哪些情境因素影响学习。
在这一点上,我必须把它们算作1而不是2。你知道这在RegExp中有多可能吗?

o8x7eapl

o8x7eapl1#

你可以使用lookaheads来Assert它,然后计算匹配次数:

(?=\w*_(?:WEAK|CONTRAST|CONTR[_)]))\b\w+\b

示例:http://regex101.com/r/xP2yI7/3
注意匹配计数。
这将匹配整个IMPSENT_CONTRAST_EMPH_WEAKCONTR_VIS表达式,但只有当它匹配lookahead中的部分时,它才会过滤您正在寻找的关键字。即使在同一行上有多个这样的句子,这也会匹配。
此外,我还简化了正则表达式,保留了相同的含义。请注意,您不必转义_

0pizxfdo

0pizxfdo2#

你真的只关心标签是否显示在行中,所以只要抓住整行,只要它有一个标签,就像这样:

/^([A-Z_]+(WEAK|CONTRAST|CONTR)+[A-Z_]*)/gm

从**^行的开头开始,查找带有A-Z_**后跟标签的单词块,可以选择后跟更多单词/下划线。
DEMO

qeeaahzv

qeeaahzv3#

你可以尝试添加\w+

/(\_(WEAK\w+))|(\_CONTRAST\w+)|(\_CONTR(\_\w+|\())/g
kdfy810k

kdfy810k4#

像这样的吗

(^(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\()))

相关问题