Convert Case to ...



  • It’s great to have the Convert Case to capability. Can it be enhanced to include more options? For example, the TitleCase Addon for Mozilla Thunderbird has these options:

    • tOGGLE cASE
    • Proper case
    • Title Case
    • Title Case (CamelCase)
    • Start Case
    • Start Case (CamelCase)
    • CamelCase
    • UPPER CASE
    • lower case

    Thanks!



  • This would be an absolutely wonderful addition! I would do it myself if i knew how…



  • Install TextFX plugin, it’s one of the best plugins.



  • Hello Jeronymite and All,

    UPDATED on 12/02/2016 ( addition of the syntax (?-is), in front of each regex, to ensure that :

    • The search is performed in a sensitive way

    • The dot meta-character matches standard characters, only

    I did some investigations, on the Net, about the different Capitalization rules. Below, 3 links to interesting articles on that topic :

    http://c2.com/cgi/wiki?CapitalizationRules

    https://en.wikipedia.org/wiki/Letter_case

    http://www.titlecase.com/


    From that documentation, here is, below, a ( non exhaustive !) summary of the main kinds of capitalisation :

    • UPPERCASE / All-caps THE MAPS AND A BOOK ARE IN MY BROWN FRENCH BAG. --> All letters are UPPERCASE

    • Start Case / Proper Case The Maps And A Book Are In My Brown French Bag. --> All words are Capitalized, regardless its category

    • tOGGLE cASE ( from ABOVE ) tHE mAPS aND a bOOK aRE iN mY bROWN fRENCH bAG. --> INVERT the case of each letter

    • Title Case The Maps and a Book Are in My Brown French Bag. --> FIRST word Capitalized, and all other words, except for articles, prepositions and conjunctions

    • Title Case, Variant 1 The Maps and a Book are in My Brown French Bag. --> As “Title Case” and excepting the forms of “to be

    • Title Case, Variant 2 The Maps and a Book are in my Brown French Bag. --> As “Title Case” but except for all closed-class words

    • German Sentence Case The Maps and a Book are in my brown French Bag. --> FIRST word and all NOUNS are Capitalized

    • german mid Sentence Case the Maps and a Book are in my brown French Bag. --> All NOUNS are Capitalized, except for the FIRST word

    • Sentence case The maps and a book are in my brown French bag. --> FIRST word, Proper nouns and some specific words ( as the pronoun I ) are Capitalized

    • mid sentence case the maps and a book are in my brown French bag. --> As above, but FIRST word is NOT Capitalized

    • lowercase the maps and a book are in my brown french bag. --> All letters are lowercase

    • SCREAMING_SNAKE_CASE THE_MAPS_AND_A_BOOK_ARE_IN_MY_BROWN_FRENCH_BAG_ --> All letters are UPPERCASE, and words separated by underscores

    • snake_case [T/t]he_maps_and_a_book_are_in_my_brown_french_bag_ --> All letters, from the second, lowercase, and words separated by underscores

    • KEBAB-CASE THE-MAPS-AND-A-BOOK-ARE-IN-MY-BROWN-FRENCH-BAG- --> All letters UPPERCASE, and words separated by hyphens

    • Train-Case The-Maps-And-A-Book-Are-In-My-Brown-French-Bag- --> All words are Capitalized and separated by hyphens

    • kebab-case [T/t]he-maps-and-a-book-are-in-my-brown-french-bag- --> All letters, from the second, lowercase, and words separated by hyphens

    • PascalCase TheMapsAndABookAreInMyBrownFrenchBag --> All words, with letters only, are Capitalized and run together

    • [Upper]CamelCase / WikiCase TheMapsAndBookAreInMyBrownFrenchBag --> As “PascalCase”, but each UPPERCASE letter must be followed by a lowercase letter ( So, initial ONE LETTER words are DELETED )

    • lowerCamelCase theMapsAndBookAreInMyBrownFrenchBag --> As “WikiCase”, except the FIRST word is lowercase

    • StUdLyCaPs ThEmApSaNdAbOoKaReInMyBrOwNfReNcHbAg --> UPPER and lower letters alternated, beginning UPPERCASE

    • StUdLyCaPs, Variant 1 tHeMaPsAnDaBoOkArEiNmYbRoWnFrEnChBaG --> UPPER and lower letters alternated, beginning lowercase

    • StUdLyCaPs, Variant 2 thEmApsAndAbOOkArEInmYbrOwnfrEnchbAg --> VOWELS are UPPERCASE and CONSONANTS are lowercase

    • CaNoNiCaLSTuDLyCaPS THeMaPSaNDaBooKaReiNMyBRoWNFReNCHBaG --> VOWELS are lowercase and CONSONANTS are UPPERCASE ( used by the dyslexic )

    • MiXEdCapS TheMApsANdabOokaREINmyBrOWnFrencHBAG The Case of the letters change almost RANDOMLY


    Be aware that you may get some odd replacements, with some capitalizations. Just consider, these few examples, below, with the Proper Case capitalization rule :

    • If word = McDonald , Proper Case --> Mcdonald
    • If word = MacDonald, Proper Case --> Macdonald
    • If word = Google’s, Proper Case --> Google’S
    • If word = A FBI Inspector, Proper Case --> A Fbi Inspector
    • If word = my.email@test.com, Proper Case --> My.Email@Test.Com
    • If word = John Smith III, Proper Case --> John Smith Iii

    From that list above, it’s obvious that we can’t build a search/replacement, with regular expressions, for the following capitalizations !

    • Title Case, and its variants
    • German Sentence Case and German mid Sentence Case
    • Sentence case and mid Sentence case
    • MiXEdCapS

    Indeed, these capitalizations have a lot of exceptions or rules, that closely depends on grammar and spelling, completely unreachable with regex S/R !!!


    For all the others kinds of capitalization, here is, below, a list of standard regex S/R that achieves the appropriate case modifications.

    I included, in that list, a “light” version of the “Sentence case”, which :

    • can handle successive sentences, in one go

    • correctly write the pronoun I, in an UPPERCASE way

    • Unfortunately, replaces Proper nouns and some specific words (as names of the days, …), in a lowercase way :-((


    About the following S/R, some hypotheses are supposed :

    • You must SELECT the area to apply a particular capitalization rule, FIRST

    • The Regular expression search mode is SET

    • The In selection option should be CHECKED, on opening the Replace dialog, because of the previous selection


    For UPPER CASE : SEARCH = (?-is).+ and REPLACE = \U$0

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HI GUYS : O’NEIL, AND I, CREATED A TEST. WHAT DO YOU THINK ABOUT IT? I QUITE LIKE THAT MP3 SONG! / ‘T_EST’ T-EST “ABC”.


    For Start Case / Proper Case : SEARCH = (?-is)(\w)(\w*) and REPLACE = \u\1\L\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER Hi Guys : O’Neil, And I, Created A Test. What Do You Think About It? I Quite Like That Mp3 Song! / ‘T_est’ T-Est “Abc”.


    For tOGGLE cASE : SEARCH = (?-is)([A-Z])|[a-z] and REPLACE = (?1\l:\u)$0

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hI GUYS : O’NeIL, AND i, CREATED a TEST. WhAT do YOU tHINk aBOUT it? I quite LIKE THAT Mp3 sONG! / ‘t_ESt’ t-eST “AbC”.


    For “light” Sentence case : SEARCH = (?-is)([a-zA-Z])(.*?)((?=\b[Ii]\b)|(?=[.?!](\h|\R|\z)))|([a-zA-Z])(.*) and REPLACE = \u\1\5\L\2\6

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER Hi guys : o’neil, and I, created a test. What do you think about it? I quite like that mp3 song! / ‘T_est’ t-est “abc”.


    For lower case /mid sentence case : SEARCH = (?-is).+ and REPLACE = \L$0

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hi guys : o’neil, and i, created a test. what do you think about it? i quite like that mp3 song! / ‘t_est’ t-est “abc”.


    For SCREAMING_SNAKE_CASE : SEARCH = (?-is)(\w+)|[^\w\r\n]+ and REPLACE = (?1\U\1:_)

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HI_GUYS_O_NEIL_AND_I_CREATED_A_TEST_WHAT_DO_YOU_THINK_ABOUT_IT_I_QUITE_LIKE_THAT_MP3_SONG_T_EST_T_EST_ABC_


    For snake_case : SEARCH = (?-is)(\w+)|[^\w\r\n]+ and REPLACE = (?1\L\1:_)

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hi_guys_o_neil_and_i_created_a_test_what_do_you_think_about_it_i_quite_like_that_mp3_song_t_est_t_est_abc_


    For KEBAB-CASE : SEARCH = (?-is)(\w+)|[^\w\r\n]+ and REPLACE = (?1\U\1:-)

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HI-GUYS-O-NEIL-AND-I-CREATED-A-TEST-WHAT-DO-YOU-THINK-ABOUT-IT-I-QUITE-LIKE-THAT-MP3-SONG-T_EST-T-EST-ABC-


    For Train-Case : SEARCH = (?-is)(\w)(\w*)|[^\w\r\n]+ and REPLACE = (?1\u\1\L\2:-)

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER Hi-Guys-O-Neil-And-I-Created-A-Test-What-Do-You-Think-About-It-I-Quite-Like-That-Mp3-Song-T_est-T-Est-Abc-


    For kebab-case : SEARCH = (?-is)(\w+)|[^\w\r\n]+ and REPLACE = (?1\L\1:-)

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hi-guys-o-neil-and-i-created-a-test-what-do-you-think-about-it-i-quite-like-that-mp3-song-t_est-t-est-abc-


    For PascalCase : SEARCH = (?-is)([a-zA-Z])([a-zA-Z]*)|[^a-zA-Z\r\n]+ and REPLACE = \u\1\L\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HiGuysONeilAndICreatedATestWhatDoYouThinkAboutItIQuiteLikeThatMpSongTEstTEstAbc


    For CamelCase / WikiCase : SEARCH = (?-is)([a-zA-Z])([a-zA-Z]+)|(\b|_)[a-zA-Z](\b|_)|[^a-zA-Z\r\n]+ and REPLACE = \u\1\L\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HiGuysNeilAndCreatedTestWhatDoYouThinkAboutItQuiteLikeThatMpSongEstEstAbc


    For lowerCamelCase : SEARCH = (?-is)([a-zA-Z])([a-zA-Z]+)|(\b|_)[a-zA-Z](\b|_)|[^a-zA-Z\r\n]+ and REPLACE = \u\1\L\2

    then : SEARCH = (?-is)([A-Z][a-z]+){2,} REPLACE = \l$0

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hiGuysNeilAndCreatedTestWhatDoYouThinkAboutItQuiteLikeThatMpSongEstEstAbc


    For StUdLyCaPs : SEARCH = (?-is)([a-zA-Z])[^a-zA-Z\r\n]*([a-zA-Z])?|[^a-zA-Z\r\n]+ and REPLACE = \u\1\l\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HiGuYsOnEiLaNdIcReAtEdAtEsTwHaTdOyOuThInKaBoUtItIqUiTeLiKeThAtMpSoNgTeStTeStAbC


    For StUdLyCaPs, variant 1 : SEARCH = (?-is)([a-zA-Z])[^a-zA-Z\r\n]*([a-zA-Z])?|[^a-zA-Z\r\n]+ and REPLACE = \l\1\u\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hIgUySoNeIlAnDiCrEaTeDaTeStWhAtDoYoUtHiNkAbOuTiTiQuItElIkEtHaTmPsOnGtEsTtEsTaBc


    For StUdLyCaPs, variant 2 : SEARCH = (?-is)([aeiouy])|([B-DF-HJ-NP-TV-XZ])|[^a-zA-Z\r\n]+ and REPLACE = \u\1\l\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER hIgUYsOnEIlAndIcrEAtEdAtEstwhAtdOYOUthInkAbOUtItIqUItElIkEthAtmpsOngtEsttEstAbc


    For CaNoNiCaLSTuDLyCaPS : SEARCH = (?-is)([AEIOUY])|([b-df-hj-np-tv-xz])|[^a-zA-Z\r\n]+ and REPLACE = \l\1\u\2

    BEFORE Hi guys : o’nEil, and I, created A test. wHat DO you ThinK About IT? i QUITE like that mP3 Song! / ‘T_esT’ T-Est “aBc”.

    AFTER HiGuySoNeiLaNDiCReaTeDaTeSTWHaTDoyouTHiNKaBouTiTiQuiTeLiKeTHaTMPSoNGTeSTTeSTaBC


    Best regards and have a good day !

    guy038



  • +1 for this feature. I really really need this feature. Please add this feature as soon as possible.

    Thanks in advance.



  • @Jeronymite:

    I created a small plugin called “FirstUpper” that does different types of capitalizations. I am adding more options as I have time.
    The current options are:

    • Capitalize Selected Title
      • Just select the text and hit Ctrl+Alt+U to properly capitalize the title according to the Chicago Manual of style.
    • Capitalize All Markdown Titles
      • Finds all markdown headings (Setext and Atx style) and properly capitalizes them.
    • Capitalize First Letter of All Sentences
      • Capitalizes the first letter of the first word of every sentence in the document. (one issue this has is with file extensions. It will capitalize “.txt” to “.Txt”.)

    I will be adding more features such as a convert to camelcase feature.

    I hope this helps!
    Zach



  • @guy038
    I was struggle to make an expression to match a word that has at least one capital letter inside (not a lowercase) and replace that word to Start Case or Title Case
    here is an example:

    befOre: OnE teXT wIll Be transformed vERY welL

    After: One Text Will Be transformed Very Well

    if the word is lowercase or is already Start Case then it can stay as it is.

    I would appreciate any help!



  • Hello, ortomind,

    Not very difficult, indeed !

    In fact, the best would be to reverse your rules that you would like to ! So :

    • If a word contains, ONLY, lowercase letters ( and possible digits and/or the underscore character ), just rewrite it

    • ELSE, any word must be rewritten, with the Start Case capitalization rule


    Therefore, a correct regex S/R could be :

    SEARCH (?-i)\b[\l\d_]+\b|(\w)(\w*)

    REPLACE (?1\u\1\L\2:$0)


    NOTES :

    • First, the in-line modifier (?-i) forces the regex engine to search in a sensitive way

    • Then, due to | character, the regex engine must choose between the two alternatives :

      • A Non-Empty range of Non_Upper characters [\l\d_]+, which must be a true word, due to the \b assertions, that surround it

      • Any other word, containing, at least, one character, with two groups :

        • The first character of the word, stored in group 1 ( (\w) )

        • All the remaining characters of this word, stored in group 2 ( (\w*) )

    • In replacement, the syntax represents a conditional replacement, based on group 1

      • If group 1 exists, we rewrite this group ( the first character of a word ) uppercase ( \u\1 ), then, the group 2 ( All the remaining characters ) lowercase ( \L\2 )

      • Else ( Group 1 do not exist ) we just rewrite the entire matched string ( the word, with NO uppercase letter ) ( $0 )


    So, for instance, from the original text, below :

    OnE teXT wIll Be trans_formed123 vERY welL
    

    After clicking of the Replace All button, you should obtain, with the regex S/R above, the modified text, below :

     One Text Will Be trans_formed123 Very Well
    

    With the message Replace All: 7 occurrences were remplaced

    Best Regards,

    guy038



  • Dear guy038,
    This works as it supposed and I thank you for it.
    Could you tell me if there is a way to insert this in a macro?
    Eventually how I can do at once in a macro all following 3 search/replace:
    SEARCH (?-i)\b[\l\d_]+\b|(\w)(\w*)
    REPLACE (?1\u\1\L\2:$0)
    SEARCH ([^\s])([ ]{2,})([^\s])
    REPLACE \1 \3
    SEARCH [>:!?.] [A-Z]
    REPLACE \L$0
    thanks,
    ortomind



  • @ortomind

    There is documentation on how to place search+replace in a macro, here: http://docs.notepad-plus-plus.org/index.php/Editing_Configuration_Files#Search_.2F_Replace_encoding

    That may be a bit cryptic, but here’s one example of many that can be found, that show how to implement a real use-case: https://notepad-plus-plus.org/community/topic/11735/notepad-macro-not-working-correctly/2

    You can adapt this example (which coincidentally also involves upper/lowercase manipulation!) for what you’re trying to do.


Log in to reply