grep заглавные слова в нижний регистр, исключая римские цифры - PullRequest
3 голосов
/ 14 февраля 2012

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

Единственный способ, который я нашел, - преобразовать все слова в верхнем регистре, за которыми следуют пробел, запятая или точка, а также дефисные слова в нижний регистр. Затем преобразуйте все римские цифры в верхний регистр.

Я использовал это для преобразования в нижний регистр:

(\u+[ ,.-])

Затем мне пришлось пройти и найти и заменить все подозрительные римские цифры.

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

Образец, на котором я тестирую это, - Конституция США. Вот пример ввода:

МЫ, ЛЮДИ СОЕДИНЕННЫХ ШТАТОВ, чтобы сформировать более совершенный союз, установить справедливость, обеспечить внутреннее спокойствие, обеспечить общая защита, содействие общему благосостоянию и получение благословений свободы нам и нашим потомкам эта Конституция для Соединенных Штатов Америки.

СТАТЬЯ I.

Секта. 1. ВСЕ законодательные полномочия, предоставленные в настоящем документе, принадлежат Конгрессу Соединенных Штатов, который состоит из Сената и Палаты представителей.

Секта. 2. Палата представителей состоять из членов, выбираемых каждый второй год всеми несколько штатов, и выборщики в каждом штате имеют квалификационные реквизиты для избирателей самого многочисленного отделения Законодательный орган штата. Никто не может быть Представителем, который должен не достигли возраста двадцати пяти лет, а были семь лет гражданином Соединенных Штатов, и кто не должен, когда избран, быть жителем того государства, в котором он будет избран.

СТАТЬЯ IV.

СТАТЬЯ V.

СТАТЬЯ VI.

1 Ответ

3 голосов
/ 14 февраля 2012

, если разновидность регулярного выражения поддерживает отрицательные взгляды, вы можете попробовать:

\b(?![LXIVCDM]+\b)([A-Z]+)\b

, который говорит "любые слова верхнего регистра, которые не полностью состоят из L, X, I, V, C,D, M "(римские цифры).

Также удобно останавливает преобразование слова" I ".(Кроме того, если вы хотите предотвратить преобразование однобуквенных заглавных слов, используйте [A-Z]{2,} - это предотвратит преобразование заглавной буквы "A" (в начале предложения) и меня, что обычно требуетсячтобы остаться в их обычном случае).

Это остановило бы слова, состоящие целиком из сопоставляемых букв - единственные, о которых я могу думать, это "DID" и, возможно, "DIV" (как в HTML), "DIM" (как в измерении), "MID", "MIDI", "VIC" (как в Виктории?) ...

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

(?=[MDCLXVI])M{0,3}(C[DM]|DC{0,3}|C{1,3})?(X[LC]|LX{0,3}|X{1,3})?(I[XV]|VI{0,3}|I{1,3})?

Объяснение:

(?=[MDCLXVI])           # make sure we match at least something
                        # (since everything in this regex is optional)
M{0,3}                  # Can have 0 to 3 Ms, being thousands
(C[DM]|DC{0,3}|C{1,3})? # for the hundreds column can have CD, CM, 
                        # C, CC, CCC, D, DC, DCC, DCCC
(X[LC]|LX{0,3}|X{1,3})? # for the tens column can have XL, XC, 
                        # L, LX, LXX, LXXX, X, XX, XXX
(I[XV]|VI{0,3}|I{1,3})? # for the ones column can have IX, IV,
                        # V, VI, VII, VIII, I, II, III.

I думаю , который охватывает все возможные римские цифры ....

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

\b((ROMAN_NUMERAL_REGEX)|([A-Z]+))\b

и заменить на "$ 2 $ 3_converted_to_lower_case" (извините - я не знаюкак сделать само преобразование).

Выше будет работать, потому чторегулярное выражение только когда-либо соответствует или регулярному выражению римской цифры (и записывается в $ 2), или другому регулярному выражению (захвачено в $ 3).Таким образом, один из $ 2 или $ 3 всегда пуст.

...