Regex PCRE正则表达式:是否可以仅在字符串的前X个字符内检查匹配
PCRE正则表达式:正则表达式是否可以只在字符串的前X个字符内检查模式匹配,而忽略该点以外的字符串其他部分? 我的正则表达式: 我有一个正则表达式:Regex PCRE正则表达式:是否可以仅在字符串的前X个字符内检查匹配,regex,pcre,Regex,Pcre,PCRE正则表达式:正则表达式是否可以只在字符串的前X个字符内检查模式匹配,而忽略该点以外的字符串其他部分? 我的正则表达式: 我有一个正则表达式: /\S+V\s*/ 这将检查字符串中是否有尾随“V”的非空白字符,然后是空白字符或字符串结尾 这很有效。例如: 示例A: 示例B: 回复:每个字母的大写文本和字母位置在源数据中具有含义。接下来是供人类阅读的一般信息(“学院网络活动”,等等) 我的问题: 从理论上讲,有时会出现涉及罗马数字的名称,例如: 示例C: 我希望上面的正则表达式只检查字符串
/\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个或更多字符,尽可能多,然后是一个或多个非空格和^.{25,}\S+V.*(*F)
,然后是字符串的其余部分,匹配失败并跳过V
-或|
-匹配一个或多个非空白、\S+V\S*
和零个或多个空白字符V
^.{25,}\S+V.*(*F)|\S+V\S)*
看。详情:
-字符串的开头,除换行符以外的25个或更多字符,尽可能多,然后是一个或多个非空格和^.{25,}\S+V.*(*F)
,然后是字符串的其余部分,匹配失败并跳过V
-或|
-匹配一个或多个非空白、\S+V\S*
和零个或多个空白字符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个步骤,