我有以下维度元素列表(不完整,实际上要长得多):
Ktr_12345_180
Ktr_12345_160
Ktr_12345_1130
Kst_12345_180
Kst_12345_112
Kst_12345_120
Kst_12345_160我的目标是在Jedox 2019.1子集编辑器中创建元素子集。子集应该包括以前缀"Ktr_"开头的所有元素,而不是后缀_160或_180。
我已经构建了一个Regex (Ktr_)+[0-9]+(_180|_160),它标识了我不想要的元素。
现在我得把它倒过来。据我所知,不存在反演正则表达式的本机函数,对吗?
因此,我尝试使用负面展望:(Ktr_)+[0-9]+(?!(_180|_160))来实现这一点。
这根本不起作用。我试过不同的形状,没有达到我的目标.
我希望regex能提供被通缉的元素。相反,它只显示以"Ktr_"作为前缀的每个元素。
发布于 2019-04-02 17:00:06
你需要的正确标准是这个
\bKtr_[0-9]+_(?!1[68]0\b)[0-9]+\b这里,正则表达式周围的\b单词边界确保它不会在更大的文本中提供部分匹配,而(?!1[68]0\b)是拒绝160或180字符串所需的负面展望,模式的其余部分与您的相似。另外,除非您需要一个组,否则不需要以(Ktr_)+的形式编写第一部分,而且这将允许Ktr_完整地编写一次或多次查看示例时认为您不需要的部分。因此,我仅将其更改为简单的Ktr_,但如果这是有效的并且确实需要的话,则通过用(Ktr_)+替换Krt_来保留它
发布于 2019-04-03 11:34:59
另一种方法是匹配模式,然后对负面的背景进行否定。
尝尝这个
$ cat paul.txt
Ktr_12345_180
Ktr_12345_160
Ktr_12345_1130
Kst_12345_180
Kst_12345_112
Kst_12345_120
Kst_12345_160
$ perl -lne ' print if /(Ktr_).+?(?<!_180|_160)\b/ ' paul.txt
Ktr_12345_1130
$ perl -lne ' print if /(Ktr_)+[0-9]+.+?(?<!_180|_160)\b/ ' paul.txt
Ktr_12345_1130
$https://stackoverflow.com/questions/55479950
复制相似问题