2016-03-10 2 views
1

У меня есть этот текст: Retailer-ul Amazon foloseste metode severe pentru a-si descuraja etc. angajatii din depozite sa nu mai fure din produse. Pe ecrane li se arata siluete de angajati care au furat produse, li se spune ce au furat si cat valorau produsele, aparand si mentiunea "arestat" sau "concediat", scrie Bloomberg. Unii spun ca... and so on и я пытаюсь заменить все строки, которые являются аббревиатурами внутри Fraze, так, например, etc. это аббревиатура, потому что это следующее слово angajatii начинается с строчная буква, в отличие от produse., которая является окончанием фразы, потому что следующее слово Pe начинается с прописной буквы, и я не хочу ее удалять.PHP строка матча preg_replace, но заменить только часть его

У меня есть этот код $subject = preg_replace('~\b[a-z]+\.\s[a-z]~', '', $subject);, который соответствует каждой аббревиатуре с . после него и пространства (\s), а затем строчной буква [a-z] (например. descuraja etc. angajatii превращается в descuraja ngajatii вместо descuraja angajatii). Я не хочу заменять строчную букву следующего слова. Я как-то не могу избежать его замены. Как я могу сохранить один и тот же шаблон соответствия, но вместо него следует заменить только аббревиатуру, точку и пробел? Спасибо.

+1

[ '\ B [A-Z] + \. \ S (? = [А-г])'] (https://regex101.com/r/mM5qX6/1)? –

+0

@ WiktorStribiżew чувак, вы рок, спасибо, он работает, можете ли вы представить его в качестве ответа и кратко объяснить, почему добавление (? =) Работает? – southpaw93

ответ

3

Вам нужно обернуть [a-z] в positive lookahead:

\b[a-z]+\.\s(?=[a-z]) 

См regex demo

опережения конструкция просто проверяет, если какой-то шаблон определенный в нем появляется справа от текущего местоположения. Итак, (?=[a-z]) проверяет, есть ли строчная ASCII буква сразу после пробела, сопоставленного \s. Если есть строчный регистр, возвращается совпадение (и происходит замена), если он не находит маленькую букву, совпадение не выполняется, замена не происходит.

+0

удивительно, поэтому, добавив (? = [A-z]), он соответствует ему, но не заменяет его? Я отвечу на ваш ответ через 7 минут. – southpaw93

+1

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

1

попробовать этот \b[a-z]+\.\s(?=[a-z])

+0

Попробуйте это, потому что Wiktor говорит так :)? –

Смежные вопросы