Regex perl正则表达式字符类

Regex perl正则表达式字符类,regex,perl,Regex,Perl,我在perl中对正则表达式进行分组时遇到问题 当然,这是一个更大的问题,但这是我正在处理的同一个概念。提前感谢大家的评论和想法 下面的正则表达式应该只关心字符串的这一部分来做出决定 医生:嗯 医生:ep 医生:前 但不是 医生:嗯 代码: 由于字符串末尾不匹配,我认为需要两个正则表达式 $regex = "doctor_who:e[epx]"; # match $not_regex "doctor_who:e[epx][a-z]"; #-do not match 那就做吧 if( $strin

我在perl中对正则表达式进行分组时遇到问题

当然,这是一个更大的问题,但这是我正在处理的同一个概念。提前感谢大家的评论和想法

下面的正则表达式应该只关心字符串的这一部分来做出决定

医生:嗯

医生:ep

医生:前

但不是

医生:嗯

代码:


由于字符串末尾不匹配,我认为需要两个正则表达式

$regex = "doctor_who:e[epx]"; # match
$not_regex "doctor_who:e[epx][a-z]"; #-do not match
那就做吧

if( $string =~ $regex and $string !~ $not_regex ){}

由于字符串末尾不匹配,我认为需要两个正则表达式

$regex = "doctor_who:e[epx]"; # match
$not_regex "doctor_who:e[epx][a-z]"; #-do not match
那就做吧

if( $string =~ $regex and $string !~ $not_regex ){}

你可以用两种方法来做这件事,你把这两种方法结合起来

使用字符类:

$regex = 'doctor_who:e[epx]';
使用替换项:

$regex = 'doctor_who:e(e|p|x)';
它们提供了正匹配,但它们需要其他东西来拒绝
eeh
匹配

但是,
eeh
是唯一要拒绝的匹配项吗?这是你提到的唯一一个,但是,你会喜欢更一般的东西吗,比如任何a-z字符?(例如)eec怎么样?它应该匹配还是被拒绝

从示例中,
ee1
匹配。这是因为
1
不是
h
还是因为它是一个数字

(至少对我来说)最好、最简洁的正则表达式应该是什么并不完全清楚,因为示例中存在一些漏洞。所以,这里有一些正则表达式,是基于我对你真正想要的东西所做的假设

因此,如果
eeh
是唯一的拒绝,则添加:

$regex .= '[^h]';
如果您想要更广泛的拒绝:

$regex .= '[^a-z]';
或者,您可能只希望匹配数字:

$regex .= '[0-9]';

旁注:此答案经过编辑以反映下面的评论

您可以通过两种方式完成此操作,并将两者结合起来

使用字符类:

$regex = 'doctor_who:e[epx]';
使用替换项:

$regex = 'doctor_who:e(e|p|x)';
它们提供了正匹配,但它们需要其他东西来拒绝
eeh
匹配

但是,
eeh
是唯一要拒绝的匹配项吗?这是你提到的唯一一个,但是,你会喜欢更一般的东西吗,比如任何a-z字符?(例如)eec怎么样?它应该匹配还是被拒绝

从示例中,
ee1
匹配。这是因为
1
不是
h
还是因为它是一个数字

(至少对我来说)最好、最简洁的正则表达式应该是什么并不完全清楚,因为示例中存在一些漏洞。所以,这里有一些正则表达式,是基于我对你真正想要的东西所做的假设

因此,如果
eeh
是唯一的拒绝,则添加:

$regex .= '[^h]';
如果您想要更广泛的拒绝:

$regex .= '[^a-z]';
或者,您可能只希望匹配数字:

$regex .= '[0-9]';

旁注:此答案经过编辑以反映下面的评论

它与一个否定的前瞻零宽度断言无关。这假设您唯一不想特别匹配的是
doctor\u who:eeh*

/doctor_who:e(?!eh)[epx]/ 
在上面的例子中,只要我们匹配
doctor\u who:e
,我们就会在每个匹配上触发前瞻。如@ikegami的评论所述,我们只有在绝对必要的情况下才能使用它来提高效率:

/doctor_who:e(?:[px]|e(?!h))/ 
除非
后面的第二个字符不是
p
x
,并且仅当该字符是
e
时,否则将推迟前瞻

注释中显示的第二个示例根本不使用lookarounds:

/doctor_who:e(?:[px]|e[^h])/

使用一个负的前瞻零宽度断言是很简单的。这假设您唯一不想特别匹配的是
doctor\u who:eeh*

/doctor_who:e(?!eh)[epx]/ 
在上面的例子中,只要我们匹配
doctor\u who:e
,我们就会在每个匹配上触发前瞻。如@ikegami的评论所述,我们只有在绝对必要的情况下才能使用它来提高效率:

/doctor_who:e(?:[px]|e(?!h))/ 
除非
后面的第二个字符不是
p
x
,并且仅当该字符是
e
时,否则将推迟前瞻

注释中显示的第二个示例根本不使用lookarounds:

/doctor_who:e(?:[px]|e[^h])/

他不想在绳子的末端匹配。那永远也配不上。他不想在绳子的末端配上。那永远不会匹配,因为matchOP没有尝试匹配字符串的末尾。如果要这样做,就必须将字符串替换为特定长度(或者只提取所需的部分),然后用$match匹配,这也行不通。单词边界是空白,在他试图点击的内容之后没有空白:)参见我的上一篇文章comment@stevieb我一直在努力。从顶部看,如果前两个字符匹配,则拒绝似乎[仅]
eeh
。但是,
eec
是否也会失败[但
ee1
匹配]?在这一点上,对我来说,即使给出了
$regex.='[^h]'的示例,意图/标准也不清楚
不允许
:eph
:exh
:eeh
一起匹配,OP不尝试在字符串末尾匹配。如果要这样做,就必须将字符串替换为特定长度(或者只提取所需的部分),然后用$match匹配,这也行不通。单词边界是空白,在他试图点击的内容之后没有空白:)参见我的上一篇文章comment@stevieb我一直在努力。从顶部看,如果前两个字符匹配,则拒绝似乎[仅]
eeh
。但是,
eec
是否也会失败[但
ee1
匹配]?在这一点上,对我来说,即使给出了
$regex.='[^h]'的示例,意图/标准也不清楚
不允许
:eph
:exh
匹配,以及
:eeh
周围环境相当昂贵,因此我将以
/doctor\u who:e(?[px]| e(?h))/
或甚至
/doctor\u who:e(?[px]| e(?[h]| z]/
的形式编写。实际上,可以使用
[^h]
而不是
(?:[^h]|\z)