【发布时间】:2021-01-27 00:32:41
【问题描述】:
PCRE 正则表达式:正则表达式是否可以仅在字符串的前 X 个字符内检查模式匹配,而忽略该点之后字符串的其他部分?
我的正则表达式:
我有一个正则表达式:
/\S+V\s*/
这会检查字符串中是否有尾随“V”和空格字符或字符串结尾的非空白字符。
这行得通。例如:
示例 A:
SEBSTI FMDE OPORV AWEN STEM students into STEM // Match found in 'OPORV' (correct)
示例 B:
ARKFE SSETE BLMI EDSF BRNT CARFR (name removed) Academy Networking Event //Match not found (correct).
Re:每个字母的大写文本和字母位置在源数据中都有含义。接下来是供人类阅读的通用信息(“学院网络活动”等)
我的问题:
理论上有时会出现一些名称涉及罗马数字,例如:
示例 C:
ARKFE SSETE BLME CARFR Academy IV Networking Event //Match found (incorrect).
我希望我上面的正则表达式只检查字符串的前 X 个字符。
这可以在 PCRE Regex 本身中完成吗?我在正则表达式中找不到任何长度计数的参考,我怀疑这不容易实现。字符串长度是完全任意的。 (我们无法控制源数据)。
意图:
/\S+V\s*/{check within first 25 characters only}
ARKFE SSETE BLME CARFR Academy IV Networking Event ^ \- Cut off point. Not found so far so stop. //Match not found (correct).
解决方法:
正则表达式在 PHP 中,我目前的解决方案是在 PHP 中剪切字符串,只检查前 X 个字符,通常是前 20 个字符,但我很好奇是否有办法在正则表达式中做到这一点而无需需要直接在 PHP 中操作字符串?
$valueSubstring = substr($coreRow['value'],0,20); /* first 20 characters only */
$virtualCount = preg_match_all('/\S+V\s*/',$valueSubstring);
【问题讨论】:
-
您的“解决方法”听起来是最简单的方法,而且可能是任何人都会推荐的。找到一种仅使用正则表达式的方法可能会使正则表达式更难理解。
-
@HernánAlarcón 绝对是,但我很好奇,因为我从未见过任何正则表达式引用仅搜索字符串的子部分。
-
如果你坚持,我猜你可以在匹配前使用积极的后视来匹配最多 25-n 个字符(长度为 n)。
-
“ARKFE SSETE BLMEV CARFR Academy IV 联谊活动”怎么样?