Php 仅在句子中间匹配的正则表达式
我正在尝试创建一个regexp,以便仅在句子的中间处匹配独立字母I和V 我使用preg_match_all,因为可能有多个匹配 如果需要的话,我可以创建多个regexp,也就是说,如果更清楚的话,可以将事情分割开来,而不是只创建一个复杂的regexp 字符串永远不会包含换行符-它永远不会是多行 示例:Php 仅在句子中间匹配的正则表达式,php,regex,Php,Regex,我正在尝试创建一个regexp,以便仅在句子的中间处匹配独立字母I和V 我使用preg_match_all,因为可能有多个匹配 如果需要的话,我可以创建多个regexp,也就是说,如果更清楚的话,可以将事情分割开来,而不是只创建一个复杂的regexp 字符串永远不会包含换行符-它永远不会是多行 示例: Materialy I regionalʹnoĭ将创建匹配,并捕获I Materialy V regionalʹnoĭ将创建匹配,并捕获V V strane lʹdov-将不创建匹配,因为V位于句
Materialy I regionalʹnoĭ
将创建匹配,并捕获I
Materialy V regionalʹnoĭ
将创建匹配,并捕获V
V strane lʹdov
-将不创建匹配,因为V位于句子字符串的开头
材料。V dvukh tomakh
不会创建匹配,因为V位于句子的开头,即在点空格之后
John i Vladimir
将不为V创建匹配,因为V不是独立的
johni-Vladimir
不会为i创建匹配,因为i是小写
< V > Srang-Lodov - Materialy i区域不“< < /代码>将捕获<强> < < /强> <代码> i>代码>,因为只有在句子的中间。
我一直在尝试^(?:(?![]等的各种组合,但无法实现这一点。下面是一个满足您的用例的简单正则表达式
preg_match('/.*[^\.]\h([VI])\h.*/', 'V strane lʹdov - Materialy I regionalʹnoĭ');
你可以用
'~[?!.]\s*[VI](*SKIP)(*F)|(?<=\s)[VI](?=\s)~'
“~[?!.]\s*[VI](*跳过)(*F)|(?是否要”~(?你需要正则表达式为什么不找到'I'或'V'呢?你应该展示你的尝试,以及结果。谢谢,Wiktor-这似乎是基于演示的工作,我现在只是想理解它。你可以补充一下,作为一个答案,这样我可以确保你得到声誉分数吗?@WiktorStribiżew你真的是一个正则表达式的上帝!你的正则表达式会ld仍然在@N69S行的开头捕获V
否,不可能是正确的在线演示。OP不是对多行文本使用正则表达式,而是对独立字符串使用正则表达式。我可能应该注意到,该字符串永远不会包含换行符-它永远不会是多行。@N69S如果需要匹配水平空格,则d让它像regex101一样适用于多行文本,只需将所有\s
替换为\h
。就像我在我的中所做的那样。再次感谢-这一切都非常令人印象深刻。尽管使用regexps多年了,但我还没有使用的经验(?这是一个不合适的解决方案。1)*
开始时,由于回溯过多,性能会大大降低,特别是对于较长的字符串,2)文字空格不考虑其他空格字符,3)如果在V
或I
之前有两个或更多空格,正则表达式将失败,4)?
和!
句尾标点符号不被考虑。@WiktorStribiżew我确实说过它满足提供的用例。那么,如果+
匹配所有用例,这是否意味着它是可以的?这是对提供的信息的有效回答。无论如何,感谢您的评论
'~(?<=\s)(?<![?!.]\s)[VI](?=\s)~'