PHP Regex соответствует полной остановке после определенного количества символов

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

this is a long sentence. it contains a few full stops in it. I want to match the full stop after the halfway point.

this sentence is shorter. it also contains full stops but not many.

Он также не должен совпадать с последней точкой. Оно должно совпадать со второй точкой в ​​первом предложении и не совпадать во втором. Таким образом, матч должен выглядеть так:

this is a long sentence. it contains a few full stops in it[.] I want to match the full stop after the halfway point.

this sentence is shorter. it also contains full stops but not many.   [no match]

Есть ли способ сделать это? У меня есть что-то вроде этого, которое вообще не работает:

/[.]{20,}/

person Hasen    schedule 28.09.2017    source источник
comment
Это звучит довольно расплывчато. См. .{30,}?\K\.(?=.{30,}), точка будет соответствовать только после 30 или более символов, и если за ней следует с 30 и более символов.   -  person Wiktor Stribiżew    schedule 28.09.2017
comment
Это было быстро, я еще даже не закончил редактировать вопрос. Это не соответствует? На самом деле это было для preg_split.   -  person Hasen    schedule 28.09.2017
comment
Решение Виктора Стрибижева работает хорошо   -  person François LEPORCQ    schedule 28.09.2017
comment
@Hasen Это .{30,}?\K\.(?=.{30,}) действительно работает на тебя? Я имею в виду, что на самом деле это не делит строки на 2 части, а просто соответствует ., которые находятся на расстоянии 30 символов. См. regex101.com/r/P6JIa5/3. Я до сих пор не понимаю требований.   -  person Wiktor Stribiżew    schedule 28.09.2017
comment
Я могу сначала рассчитать промежуточную точку для каждого предложения с помощью php, чтобы получить значение, которое в настоящее время равно 30, проблема в том, что в этой точке действительно нужно разделить предложение на два с помощью preg_split. Я думаю, мой вопрос не был ясен, я думал, что это то, о чем я спрашивал. Думаю, мне нужен какой-то (шаблон)+(шаблон), чтобы получить две части предложения.   -  person Hasen    schedule 28.09.2017
comment
В конце концов мне удалось понять это на основе шаблона, который вы дали. Спасибо большое.   -  person Hasen    schedule 28.09.2017


Ответы (1)


Согласно вашему отзыву,

.{30,}?\K\.(?=.{30,})

шаблон работает на вас. См. демонстрацию регулярного выражения.

Идея состоит в том, чтобы найти длину строки, разделить на 2, чтобы получить символ в середине, и вычесть 1 или 2 из полученного значения и использовать его вместо 30 в ограничивающем квантификаторе в приведенном выше шаблоне.

Сведения о шаблоне

  • .{30,}? - любые 30 символов, кроме символов разрыва строки или более, но как можно меньше,
  • \K - оператор сброса соответствия, который пропускает текст, совпавший до сих пор
  • \. - точка
  • (?=.{30,}) - положительный просмотр вперед, который требует наличия не менее 30 любых символов, кроме разрывов строк, непосредственно справа от текущего местоположения.
person Wiktor Stribiżew    schedule 28.09.2017