Regex PCRE正则表达式:是否可以仅在字符串的前X个字符内检查匹配

Regex PCRE正则表达式:是否可以仅在字符串的前X个字符内检查匹配,regex,pcre,Regex,Pcre,PCRE正则表达式:正则表达式是否可以只在字符串的前X个字符内检查模式匹配,而忽略该点以外的字符串其他部分? 我的正则表达式: 我有一个正则表达式: /\S+V\s*/ 这将检查字符串中是否有尾随“V”的非空白字符,然后是空白字符或字符串结尾 这很有效。例如: 示例A: 示例B: 回复:每个字母的大写文本和字母位置在源数据中具有含义。接下来是供人类阅读的一般信息(“学院网络活动”,等等) 我的问题: 从理论上讲,有时会出现涉及罗马数字的名称,例如: 示例C: 我希望上面的正则表达式只检查字符串

PCRE正则表达式:正则表达式是否可以只在字符串的前X个字符内检查模式匹配,而忽略该点以外的字符串其他部分?

我的正则表达式: 我有一个正则表达式:

/\S+V\s*/
这将检查字符串中是否有尾随“V”的非空白字符,然后是空白字符或字符串结尾

这很有效。例如:

示例A:

示例B:

回复:每个字母的大写文本和字母位置在源数据中具有含义。接下来是供人类阅读的一般信息(“学院网络活动”,等等)

我的问题: 从理论上讲,有时会出现涉及罗马数字的名称,例如:

示例C:

我希望上面的正则表达式只检查字符串的前X个字符

这可以在PCRE正则表达式本身中完成吗?我在正则表达式中找不到任何关于长度计数的引用,我怀疑这不容易实现。字符串长度完全是任意的。(我们无法控制源数据)

意图: 解决方法: 正则表达式在PHP中,我当前的解决方案是在PHP中剪切字符串,只检查前X个字符,通常是前20个字符,但我很好奇,在正则表达式中是否有这样一种方法,而不需要在PHP中直接操作字符串

$valueSubstring = substr($coreRow['value'],0,20); /* first 20 characters only */
$virtualCount = preg_match_all('/\S+V\s*/',$valueSubstring); 

您可以在X个字符后找到您的模式并跳过整个字符串,否则,匹配您的模式。因此,如果X=25:

^.{25,}\S+V.*(*F)|\S+V\S)*
看。详情:

  • ^.{25,}\S+V.*(*F)
    -字符串的开头,除换行符以外的25个或更多字符,尽可能多,然后是一个或多个非空格和
    V
    ,然后是字符串的其余部分,匹配失败并跳过
  • |
    -或
  • \S+V\S*
    -匹配一个或多个非空白、
    V
    和零个或多个空白字符

您可以在X个字符后找到您的模式并跳过整个字符串,否则,请匹配您的模式。因此,如果X=25:

^.{25,}\S+V.*(*F)|\S+V\S)*
看。详情:

  • ^.{25,}\S+V.*(*F)
    -字符串的开头,除换行符以外的25个或更多字符,尽可能多,然后是一个或多个非空格和
    V
    ,然后是字符串的其余部分,匹配失败并跳过
  • |
    -或
  • \S+V\S*
    -匹配一个或多个非空白、
    V
    和零个或多个空白字符

在前25个位置结束的任何V

^.{1,24}V\s
^.{1,23}[A-Z]V\s

任何在前25个位置以V结尾的单词

^.{1,24}V\s
^.{1,23}[A-Z]V\s

在前25个位置结束的任何V

^.{1,24}V\s
^.{1,23}[A-Z]V\s

任何在前25个位置以V结尾的单词

^.{1,24}V\s
^.{1,23}[A-Z]V\s

诀窍是捕获先行中前25个字符之后的行尾,并检查它是否遵循子模式的最终匹配:

$pattern='~^(?=.{0,25}(.*)).*?\K\S+V\b(?=.\1)~m';

详情:

^ # start of the line

(?= # open a lookahead assertion
    .{0,25} # the twenty first chararcters
    (.*) # capture the end of the line
) # close the lookahead

.*? # consume lazily the characters

\K # the match result starts here

\S+V    # your pattern
\b      # a word boundary (that matches between a letter and a white-space
        # or the end of the string)

(?=.*\1) # check that the end of the line follows with a reference to
         # the capture group 1 content.
请注意,您也可以这样以更可读的方式编写模式:

$pattern = '~^
    (*positive_lookahead: .{0,20} (?<line_end> .* ) )
    .*?    \K    \S+ V \b
    (*positive_lookahead: .*? \g{line_end} )   ~xm';
$pattern=~^
(*正向_前瞻:.{0,20}(?.*))
.*?    \K\S+V\b
(*正向前瞻:.*?\g{line_end})~xm';

(可选语法
(*positive_lookahead:…)
从PHP 7.3开始就可用)

诀窍是捕获先行中前25个字符后的行尾,并检查它是否遵循子模式的最终匹配:

$pattern='~^(?=.{0,25}(.*)).*?\K\S+V\b(?=.\1)~m';

详情:

^ # start of the line

(?= # open a lookahead assertion
    .{0,25} # the twenty first chararcters
    (.*) # capture the end of the line
) # close the lookahead

.*? # consume lazily the characters

\K # the match result starts here

\S+V    # your pattern
\b      # a word boundary (that matches between a letter and a white-space
        # or the end of the string)

(?=.*\1) # check that the end of the line follows with a reference to
         # the capture group 1 content.
请注意,您也可以这样以更可读的方式编写模式:

$pattern = '~^
    (*positive_lookahead: .{0,20} (?<line_end> .* ) )
    .*?    \K    \S+ V \b
    (*positive_lookahead: .*? \g{line_end} )   ~xm';
$pattern=~^
(*正向_前瞻:.{0,20}(?.*))
.*?    \K\S+V\b
(*正向前瞻:.*?\g{line_end})~xm';

(可选语法
(*positive_lookahead:…)
从PHP 7.3开始就可以使用)

您的“变通方法”听起来是最简单的方法,可能是任何人都会推荐的方法。找到一种只使用正则表达式的方法可能会使正则表达式更难理解。@HernánAlarcón绝对是,但我很好奇,因为我从未见过任何正则表达式引用只搜索字符串的一个子部分。如果你坚持,我想你可以在匹配前使用正向查找来匹配最多25-n个字符(长度为n)。那么“ARKFE SSETE BLMEV CARFR Academy IV Networking Event”呢?你的“变通方法”听起来是最简单的方法,可能是任何人都会推荐的方法。找到一种只使用正则表达式的方法可能会使正则表达式更难理解。@HernánAlarcón绝对是,但我很好奇,因为我从未见过任何正则表达式引用只搜索字符串的一个子部分。如果你坚持,我想你可以在匹配前使用正向查找来匹配多达25-n个字符(长度为n)。那么“ARKFE SSETE BLMEV CARFR Academy IV Networking Event”呢?这似乎有效。谢谢我从来不知道
(*F)
功能。奇怪的是,Regex链接显示了600个步骤,但我希望在第25个字符之后,这些步骤会中止(大约60个步骤)@GerardH.Pille这就是我的意图。我只想在字符串的前X个字符中查找V,在本例中,25@Martin模式更像是示意图,PoC模式。您可以进一步改进它,例如,在跳过部分,您不需要匹配所有非空白,因此使用
^.{25,}\SV.*(*skip)(*F)|\S+V\S*
@WiktorStribiżew ahhh,我错过了修复它的
/m
。再次感谢您的建议
:-)
,这似乎很有效。谢谢我从来不知道
(*F)
功能。奇怪的是,Regex链接显示了600个步骤,