2012-02-14 3 views
3

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

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

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

(\u+[ ,.-]) 

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

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

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

МЫ, народ Соединенных Штатов, дабы образовать более совершенный союз, установить правосудие, гарантировать внутреннее спокойствие, обеспечить общей обороны, содействия общему благосостоянию , и обеспечить благословения свободы для нас самих и нашего потомства, посвятить и установить эту Конституцию для Соединенных Штатов Америки.

СТАТЬЯ I.

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

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

СТАТЬЯ IV.

СТАТЬЯ V.

СТАТЬЯ VI.

+1

Вопрос: Есть ли поддержка поддержки аромата регулярных выражений, а именно, негативные взгляды? –

+0

@ Mathematical.coffee Предназначен для InDesign CS5.5, который документально подтвердил [поддержку] (http://help.adobe.com/en_US/indesign/cs/using/WS1952D538-1335-4b1d-BA5E-FA5A176FDC9Fa.html) в двигателе регулярных выражений. – jeffrbauer

ответ

2

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

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

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

Он также удобно останавливает слово «я» от преобразования. (В стороне, если вы хотите предотвратить конвертацию однобуквенных заглавных слов, используйте [A-Z]{2,} - это может помешать капиталу «А» (в начале предложения), и я конвертируюсь, что вы обычно хотите остаться в их нормальном случае).

Это остановит слова, состоящие полностью из этих букв, которые совпадают - единственные, о которых я могу думать, - это «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. 

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

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

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

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

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

+0

Благодарим вас за построение всех этих выражений. Они работают очень хорошо, и я ценю большое количество деталей, на которые вы нашли время, чтобы написать. Я с нетерпением жду возможности узнать больше от них. – jeffrbauer