首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式创建子集

使用正则表达式创建子集
EN

Stack Overflow用户
提问于 2019-04-02 16:54:48
回答 3查看 304关注 0票数 2

我有以下维度元素列表(不完整,实际上要长得多):

代码语言:javascript
复制
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_"作为前缀的每个元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-02 17:00:06

你需要的正确标准是这个

代码语言:javascript
复制
\bKtr_[0-9]+_(?!1[68]0\b)[0-9]+\b

这里,正则表达式周围的\b单词边界确保它不会在更大的文本中提供部分匹配,而(?!1[68]0\b)是拒绝160180字符串所需的负面展望,模式的其余部分与您的相似。另外,除非您需要一个组,否则不需要以(Ktr_)+的形式编写第一部分,而且这将允许Ktr_完整地编写一次或多次查看示例时认为您不需要的部分。因此,我仅将其更改为简单的Ktr_,但如果这是有效的并且确实需要的话,则通过用(Ktr_)+替换Krt_来保留它

演示

票数 0
EN

Stack Overflow用户

发布于 2019-04-03 11:34:59

另一种方法是匹配模式,然后对负面的背景进行否定。

尝尝这个

代码语言:javascript
复制
$ 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
$
票数 1
EN

Stack Overflow用户

发布于 2019-04-02 18:15:30

您可以使用一个拥有式量词和一个额外的+来确保[0-9]+匹配的数字尽可能多,并且在匹配失败时不会尝试回溯。

代码语言:javascript
复制
(Ktr_)+[0-9]++(?!(_180|_160))

占有量词可以从Perl5.10开始使用,或者在此之前使用独立子表达式语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55479950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档