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