У меня есть несколько имен в поле, в которых инициал в середине стоит с '.' в конце..
Мне нужно регулярное выражение для преобразования этого примера:
Kenneth R.
into
Kenneth
Я пытался построить свои собственные регулярные выражения и нашел этот полезный сайт только для… $ "- что бесполезно, если в конце имени нет инициалов среднего звена ....





Чтобы удалить последнее «слово», если оно заканчивается точкой:
my $name =~ s/\w+\.$//i;
(предполагается, что после этого у вас больше нет места)
Чтобы удалить любое слово, оканчивающееся на точку:
my $name =~ s/\w+\.//i;
посмотрите на модификатор / g, если вы хотите удалить их все ...
и, кстати, составьте себе список тестовых примеров, чтобы проверить свое решение затем попробуйте с реальными данными слова, вы, вероятно, получите некоторые сюрпризы ...
ха-ха, спасибо, я видел ваш исходный ответ и обновился, и теперь появился ваш второй
Вы можете вкратце описать, как в них работает каждый элемент? я хочу узнать об этом больше, и они очень не интуитивно понятны, даже когда вы знаете, что они должны делать
Вы также можете удалить пробел перед инициалом: my $ name = ~ s / \ s + \ w + \. $ // i;
Если вам нужен способ объяснения регулярных выражений, которые вы понимаете, но не понимаете, вы можете попробовать модуль YAPE :: Regex :: Explain в форме CPAN. search.cpan.org/~pinyan/YAPE-Regex-Explain-3.011/Explain.pm
Думаю, это сработало бы лучше: s / \ s * \ w \. \ S * // i; Это регулярное выражение ищет некоторый текст, в котором есть ноль или более пробелов, за которым следует слово (в основном, az без пробелов), за которым следует точка (\ .; необходимо экранировать, потому что '.' Является особенным), за которым следует ноль или более пробелы. Он ничего не заменяет.
strager: обратите внимание, что если инициал попадает в середину имени, например "John Q. Smith", ваше решение объединит два окружающих слова, например "Джон Смит".
Чтобы заняться делом Р. Келли:
s/\w\. *//g
Вот небольшой тест:
$ echo 'R. Kelly
Kenneth R.
R. Kemp R.
John Q. Smith' | perl -pe 's/\w\. *//g'
Kelly
Kenneth
Kemp
John Smith
Я бы предложил следующее:
g).i) - нет.[:upper:]).w+, вероятно, является ошибкой, если в ваших данных нет соответствующих случаев.)perldoc perlre для получения дополнительной информации.Но обратите внимание, что если инициал попадает в середину имени, например "John Q. Smith", ваше решение объединит два окружающих слова, например "Джон Смит".
Я добавил простое исправление, которое помещает любые пробелы в конец строки. При желании это можно исправить с помощью: s / * $ //.
это работает ... большое спасибо ... см. мою правку о Р. Келли тоже. У меня есть пара имен в базе данных, которые также имеют этот формат