字符串中的Perl regexp特定字母

字符串中的Perl regexp特定字母,regex,perl,Regex,Perl,输入字符串由字母I N p U Y X组成 -我必须验证它只包含这些字母,而PERL regexp中没有其他字母 -验证输入是否还包含至少两次出现的“NP”(不带引号) 示例字符串: InPyUxNpinNpxx 字符串均为大写请使用以下命令: ^[INPUYX]*NP[INPUYX]*?NP[INPUYX]*$ 在行动中看到它: 实际上,我们在这里所做的是允许0个或多个字符类,捕获NP的第一次(必需)出现,然后确保它至少在字符串结束之前出现一次 假设如果你想抓住中间部分,你可以: ^(?=(

输入字符串由字母I N p U Y X组成

-我必须验证它只包含这些字母,而PERL regexp中没有其他字母

-验证输入是否还包含至少两次出现的“NP”(不带引号)

示例字符串:

InPyUxNpinNpxx

字符串均为大写

请使用以下命令:

^[INPUYX]*NP[INPUYX]*?NP[INPUYX]*$
在行动中看到它:

实际上,我们在这里所做的是允许0个或多个字符类,捕获NP的第一次(必需)出现,然后确保它至少在字符串结束之前出现一次

假设如果你想抓住中间部分,你可以:

^(?=(?:(.*?)NP){2})[INPUYX]+$
或者正如@ikegami指出的(仅匹配单行)
\A(?=(?:(.*)NP){2}[INPUYX]+\z

使用以下命令:

^[INPUYX]*NP[INPUYX]*?NP[INPUYX]*$
在行动中看到它:

实际上,我们在这里所做的是允许0个或多个字符类,捕获NP的第一次(必需)出现,然后确保它至少在字符串结束之前出现一次

假设如果你想抓住中间部分,你可以:

^(?=(?:(.*?)NP){2})[INPUYX]+$

或者正如@ikegami指出的(仅匹配单行)
\A(?=(?:(.*)NP){2}[INPUYX]+\z

您可以在PCRE中使用这个基于前瞻的正则表达式:

^(?=(?:.*?NP){2})[INPUYX]+$
在线演示: 说明:

^ assert position at start of a line
(?=(?:.*?NP){2}) Positive Lookahead - Assert that the regex below can be matched
(?:.*?NP){2} Non-capturing group
Quantifier: Exactly 2 times
.*? matches any character (except newline)
Quantifier: Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
NP matches the characters NP literally (case sensitive)
[INPUYX]+ match a single character present in the list below
Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy]
INPUYX a single character in the list INPUYX literally (case sensitive)
$ assert position at end of a line

您可以在PCRE中使用此基于前瞻的正则表达式:

^(?=(?:.*?NP){2})[INPUYX]+$
在线演示: 说明:

^ assert position at start of a line
(?=(?:.*?NP){2}) Positive Lookahead - Assert that the regex below can be matched
(?:.*?NP){2} Non-capturing group
Quantifier: Exactly 2 times
.*? matches any character (except newline)
Quantifier: Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
NP matches the characters NP literally (case sensitive)
[INPUYX]+ match a single character present in the list below
Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy]
INPUYX a single character in the list INPUYX literally (case sensitive)
$ assert position at end of a line

最干净的解决方案是:

/^[INPUXY]*\z/ && /NP.*NP/s

以下是最有效的方法,因为它避免了两次匹配字符串,并防止了失败时的回溯:

/
   ^
   (?:  (?:[IPUXY]|N[IUXY])* NP  ){2}
   [INPUXY]*
   \z
/x


要捕获两个NP之间的内容,可以使用

/
   ^
   (?:[IPUXY]|N[IUXY])* NP
   ( (?:[IPUXY]|N[IUXY])* ) NP
   [INPUXY]*
   \z
/x

最干净的解决方案是:

/^[INPUXY]*\z/ && /NP.*NP/s

以下是最有效的方法,因为它避免了两次匹配字符串,并防止了失败时的回溯:

/
   ^
   (?:  (?:[IPUXY]|N[IUXY])* NP  ){2}
   [INPUXY]*
   \z
/x


要捕获两个NP之间的内容,可以使用

/
   ^
   (?:[IPUXY]|N[IUXY])* NP
   ( (?:[IPUXY]|N[IUXY])* ) NP
   [INPUXY]*
   \z
/x


@r3mus:谢谢你的好话,从技术上讲,这也可以让你的换行符尾随其后。使用
\z
而不是
$
来精确匹配规范。是
\A(?=(?:.*NP){2})[INPUYX]+\z
会更好choice@r3mus,为什么要将字符串匹配两次?我更喜欢你的。如果你不喜欢重复,那么你可以创作这个图案。@ikegami当然,但这不是被问到的问题。如果OP需要更多的控制,请使用我的,如果不是,这是最短、最优雅的解决方案。@r3mus:谢谢你的好话,从技术上讲,这也允许使用尾随换行符。使用
\z
而不是
$
来精确匹配规范。是
\A(?=(?:.*NP){2})[INPUYX]+\z
会更好choice@r3mus,为什么要将字符串匹配两次?我更喜欢你的。如果你不喜欢重复,那么你可以创作这个图案。@ikegami当然,但这不是被问到的问题。如果OP需要更多的控制,请使用我的,如果不是,这是最短最优雅的解决方案。工作,现在我需要将第一个NP之间的子字符串设置为变量$1。对于示例字符串“INPYUXNPININNPXX”$1应该是“YUX”@user1100752:在注释中询问额外问题不是一个好主意。不能将其设为变量1,因为第一个捕获组用于验证第二个捕获组的存在。我会使用上面的@anabhava而不是我的,并加入一个捕获组:
^(?=(?:(.*NP){2})[INPUYX]+$
,从技术上讲,这也允许使用尾随换行符。使用
\z
而不是
$
来精确匹配规范。@user1100752:您可能可以使用我的一个稍加修改的答案:
^(?=(?:(.*NP){2})[INPUYX]+$
在第一组中给出
YUX
。工作,现在我需要将第一个NP之间的子字符串设置为变量$1。对于示例字符串“INPYUXNPININNPXX”$1应该是“YUX”@user1100752:在注释中询问额外问题不是一个好主意。不能将其设为变量1,因为第一个捕获组用于验证第二个捕获组的存在。我会使用上面的@anabhava而不是我的,并加入一个捕获组:
^(?=(?:(.*NP){2})[INPUYX]+$
,从技术上讲,这也允许使用尾随换行符。使用
\z
而不是
$
来精确匹配规范。@user1100752:您可能可以使用我的一个稍加修改的答案:
^(?=(?:(.*NP){2})[INPUYX]+$
,它在第一组中给出了
YUX