Как я могу сжать отдельные символы в Perl? - PullRequest
3 голосов
/ 17 мая 2010

Я пытаюсь идентифицировать и сжать одиночные (прописные) символы в строке.

Например:

«тест А Б тест» -> «тест АБ тест»

«тест A B C тест» -> «тест ABC тест»

«тест A B тест C D E тест» -> «тест AB тест CDE тест»

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

$str =~ s/ ([A-Z]) ([A-Z]) / \1\2 /g;

Я, вероятно, почувствую себя глупо, когда увижу решение, но я к этому готов. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 17 мая 2010
$str =~ s/\b([A-Z])\s+(?=[A-Z]\b)/$1/g;
1 голос
/ 18 мая 2010

Причина , которая не работает, заключается в том, что в вашем регулярном выражении есть пробелы в начале и в конце. Как только «A B C» становится «AB C», B больше не имеет начального пробела - там есть «A».

Самым простым решением было бы вынуть их и использовать s/([A-Z]) ([A-Z])/\1\2/g, которые должны отвечать заявленным требованиям, но это также превратило бы все заглавные фразы в один блок букв (например, «ЭТО ИСПЫТАНИЕ» -> "THISISATEST"), что может быть неприемлемо для вас.

Если вам нужно свернуть только отдельные заглавные буквы, а не их группы (например, «ДЛЯ ИМАТИЧЕСКОГО ИСПЫТАНИЯ» -> «ДЛЯ ИМА ИСПЫТАНИЯ», а не «ФОРМИРОВАНИЕ»), то я не думаю, что это возможно с одним регулярное выражение. Вам нужно будет сделать это за два прохода, один для того, чтобы отметить, какие пробелы нужно свернуть, а второй для фактического удаления меток (например, «ДЛЯ ТЕСТА IMA» -> «ДЛЯ ТЕСТА I ^ M ^ A» -> «ДЛЯ IMA»). ТЕСТ "), потому что в противном случае вы не сможете различить пару заглавных букв, которые изначально были парными, и пару, которые изначально были разделены пробелом, но уже свернуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...