Java Regex: замена точек с пробелами или удаление их, если они являются частью аббревиатуры - PullRequest
0 голосов
/ 18 октября 2010

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

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

Пример ввода и желаемых выходов:
input -> Desired Output

UK --> Великобритания

ЕС -> ЕС

bank.of -> банк

help.co.uk -> help co uk

Кто-нибудь знает о регулярном выражении или другом методе, который может помочь мне определить точки остановки, которые я хочу удалить, а не заменить?

Спасибо !!!

Ответы [ 5 ]

2 голосов
/ 18 октября 2010

Сделайте это в два этапа:

var s = "U.K. bank.of help.co.uk E.U";

//replace periods in abbreviations
var r1 = new RegExp("\\b([A-Z])\\.", 'g');
s = s.replace(r1, "$1");
console.log(s);    //UK bank.of help.co.uk EU

//replace remaining spaces:
s = s.replace(/\./g, " ");
console.log(s); //UK bank of help co uk EU

Данные регулярные выражения в JavaScript; Оставьте комментарий, если вам нужна помощь в переводе их на Java.

0 голосов
/ 26 апреля 2016

Вы можете попробовать что-то вроде этого:

inputString = inputString.replaceAll("\\.\\s+", " "); inputString = inputString.replaceAll("[^a-zA-Z0-9. ]", " ");

Это удаляет полные остановки, но сохраняет точки между сокращениями и даже URL.

0 голосов
/ 14 августа 2014

Это решение полностью работает!

String str="j.r. 20 lb jockey - j.d. pinkus j. d. choni j.d.d.";
removeInitialsDots(str);

Функция:

private String removeInitialsDots(String str) {
    str=str.replaceAll("(?i)(^([a-z])\\.|(?<= )([a-z])\\.|(?<=\\.)([a-z])\\.)", "$2$3$4").trim();  
    str=str.replaceAll("(?i)^(([a-z]) ([a-z]))($| )", "$2$3"+SPACE).trim();
    str=str.replaceAll("(?i)(?<= )(([a-z]) ([a-z]))($| )", "$2$3"+SPACE).trim();
    return str;
}

Объяснение:

(? I) -> игнорировать регистр

(^ ([az]) \. | (? <=) ([az]) \. | (? <= \.) ([az]) \.) -> (инициал в начале строки |, перед которым стоит пробел| предшествует точка)

^ (([az]) ([az])) ($ |) -> в начале строки: один символ, пробел, один символ (конец строки или пробел)

(? <=) (([Az]) ([az])) ($ |) -> с пробелом: один символ, пробел, один символ (конец строки или пробел)

$ 1 $ 2 ... -> - группы замещения, которые мы хотим, чтобы группы определялись в скобках по порядку (исключая lookbehinds (? <=)) </p>

0 голосов
/ 18 октября 2010

Вы можете попробовать сопоставить что-то вроде

^[\w.]+$

Если строка соответствует (при условии, что это только один вход), то это аббревиатура, если нет, то это набор слов, разделенных точками / точками. Не забудьте убрать пробелы, хотя. Или вы можете включить его в регулярное выражение с

^\s*[\w.]+\s*$

Это в основном говорит, что нужно найти как можно больше пар символов и периода. Если вся строка (это то, для чего нужны якоря ^ и $), это аббревиатура.

Это регулярное выражение будет соответствовать Великобритании, но не будет соответствовать bank.co.uk или даже ba.u.k (из-за двух букв вместе ba). Затем вы можете обрабатывать каждый случай, основываясь на том, соответствует ли строка регулярному выражению или нет, если его сокращение, то заменить «.» с "", а если нет, то замените "." с "".

0 голосов
/ 18 октября 2010

Попробуйте

(?<=[^a-zA-Z][a-zA-Z])\.(?=[a-zA-Z][^a-zA-Z]| )

для сопоставления полных остановок в сокращениях.

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