我不太热衷于正则表达式,我只对这个问题有一些中间知识,只是为了帮助我处理日常的PHP编程。但是我遇到的这个问题超出了我目前的知识。
我创建了一个正则表达式模式,以查找格式为word .Word
的任何字符,并将其替换为word. Word
正则表达式[ \t]*\.[ \t]*
并替换它'. '
然而,我只是注意到上面将省略号三个点(...)变成了。 。 。
我认为这可以通过积极(或消极)的前瞻(或者向后看)来解决,但是我还没有和那些人一起工作过,虽然我尝试了一点,但我找不到合适的组合排除省略号'我的正则表达式匹配的三个点。
非常感谢任何帮助,尤其是如果你可以添加到我当前的正则表达式正确的缺失部分来覆盖省略号的情况,而不是建议一个完全不同的。 TIA
答案 0 :(得分:3)
您可以使用以下正则表达式:
(?:[ \t]+\.[ \t]*)|(?:[ \t]*\.[ \t]+)|(?<=\w)\.(?=\w)
以'. '
作为替换
<强>输入:强>
word .Word #case 1
word... #case 2 (nothing should be done here)
word . Word #case3
word. Word #case 4
word.Word #case5
<强>输出:强>
word. Word
word...
word. Word
word. Word
word. Word
<强>说明:强>
...
最终会被处理,并且在每个.
之后会添加一个空格,因此我们必须添加一些约束来避免它。 (?:[ \t]+\.[ \t]*)
将处理案例#1
和#3
(强制执行您在点之前至少有空格或制表符的约束)(?:[ \t]*\.[ \t]+)
将处理案例#4
和#3
(强制执行约束,您至少有一个空格或点后面的标签)#5
将由(?<=\w)\.(?=\w)
满足,您可以在其中添加lookbehind / lookahead约束(在.
周围的字符上),以避免匹配...
请告诉我这是否清楚,是否适合您!欢呼声。
答案 1 :(得分:2)
你的正则表达式的这个扩展将做你想要的。它查找单词边界(\b
)之间的单个句点,无论间距([ \t]*
)如何,并将其替换为单个句点和空格。最后(\b|\R|$)
的正面预测允许它匹配一行中的最后一个单词。 u
修饰符的添加允许它与例如\b[ \t]*\.[ \t]*(?=\b|\R|$)
修饰符一起使用。希腊文也是。
'. '
替换为
$lorem = 'Λορεμ ιπσθμ . δολορ σιτ αμετ, διcτασ
ινcιδεριντ σεα cθ. Ρεqθε οφφενδιτ προβατθσ. ει
δθο, ατ σιντ μοδθσ σεα .Cθ qθανδο σθσcιπιτ
εφφιcιαντθρ vιμ, αν.νονθμεσ οφφιcιισ περcιπιτθρ
ηισ. Ναμ εξερcι πθτεντ . ερθδιτι ιδ, αδ
qθαεqθε γραεcισ cονσεcτετθερ νεc,
cθ ναμ σολθμ φαcερ cοτιδιεqθε . Στετ
ινvενιρε περ νο, qθο αδ λεγερε δελενιτ αδιπισcινγ .
The quick brown.fox jumps over . the lazy. dog . twice . ';
echo preg_replace('/\b[ \t]*\.[ \t]*(?=\b|\R|$)/u', '. ', $lorem);
示例:
Λορεμ ιπσθμ. δολορ σιτ αμετ, διcτασ
ινcιδεριντ σεα cθ. Ρεqθε οφφενδιτ προβατθσ. ει
δθο, ατ σιντ μοδθσ σεα. Cθ qθανδο σθσcιπιτ
εφφιcιαντθρ vιμ, αν. νονθμεσ οφφιcιισ περcιπιτθρ
ηισ. Ναμ εξερcι πθτεντ. ερθδιτι ιδ, αδ
qθαεqθε γραεcισ cονσεcτετθερ νεc,
cθ ναμ σολθμ φαcερ cοτιδιεqθε. Στετ
ινvενιρε περ νο, qθο αδ λεγερε δελενιτ αδιπισcινγ.
The quick brown. fox jumps over. the lazy. dog. twice.
输出:
NullPointerException