PCRE регулярное выражение для удаления пробела перед точкой и добавления одного после него, но также не влияет на многоточие - PullRequest
0 голосов
/ 29 мая 2018

Я не очень заинтересован в регулярных выражениях, у меня есть только некоторые промежуточные знания по этому вопросу, чтобы помочь мне справиться с повседневным программированием на PHP.Но эта проблема, с которой я столкнулся, выходит за рамки моих текущих знаний.

Я создал шаблон регулярного выражения, чтобы найти любые символы в формате word .Word и заменил его на word. Word

Регулярное выражение этого[ \t]*\.[ \t]* и замена его '. '

Однако я только что заметил, что вышеупомянутое превращает многоточие (...) в три.,,

Я думаю, что это может быть решено с положительным (или отрицательным) прогнозом (или взглядом сзади), но я никогда не работал с ними, и хотя я немного экспериментировал, я не мог найти правильную комбинациюисключить три точки многоточия из моего регулярного выражения.

Любая помощь будет высоко ценится, особенноесли бы вы могли добавить к моему текущему регулярному выражению правильную недостающую часть, чтобы покрыть случай с многоточием, вместо того, чтобы предлагать совершенно другую.ТИА

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Это расширение вашего регулярного выражения будет делать то, что вы хотите.Он ищет один период между границами слова (\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. 
0 голосов
/ 29 мая 2018

Вы можете использовать следующее регулярное выражение:

(?:[ \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ограничение (на символы, окружающие .), чтобы избежать совпадения ...

Дайте мне знать, если это понятно и работает ли оно для вас!Приветствия *. * 1049

...