There may be a way of doing this with a single operation. Usually, when approaching a problem like this, I just find a find-and-replace that will do the job if applied repeatedly some smallish number of times.
So, we’ll start out with a pattern that will leave the “hash-mark lowercase-string underscore” prefix intact as a marker, find the first subsequent uppercase letter in the fragment (if any), lowercase it, and insert the hyphen. Find: (?i)(href="[a-zA-Z/-]+\.x?html#)(?-i)([a-z]+?_[-a-z]*)([A-Z]) Replace: \1\2-\l\3 Breaking this down: (?i) Means that the pattern is case-insensitive. (href="[a-zA-Z/-]+\.x?html) matches (and captures) the initial part of a link URL string (to make sure that we don’t inadvertently transform arbitrary text in the document). (?-i) switches the remainder of the pattern to case-sensitive. (#[a-z]+?_[-a-z]*) matches and captures A string of lowercase letters followed by an underscore A possibly empty string of lowercase letters and hyphens. ([A-Z]) matches and captures the first uppercase letter in the fragment. The replacement string consists of everything up to the uppercase letter unchanged; a hyphen; and the uppercase letter, lower-cased. (“\l” means “lower-case the next character in the replacement string.) If we apply this find-and replace to your example string <a href="/premium-classic/before-you-start.xhtml#sub_KeepingLightroomUpdated">Keeping Lightroom Updated</a> We will get <a href="/premium-classic/before-you-start.xhtml#sub_-keepingLightroomUpdated">Keeping Lightroom Updated</a> Applying it repeatedly, we get <a href="/premium-classic/before-you-start.xhtml#sub_-keeping-lightroom-updated">Keeping Lightroom Updated</a> So you want to apply this with a find-and-replace-all to the entire document repeatedly until it doesn’t do anything any more. (Since it’s a no-op if it doesn’t match anything, you could just apply it five, or ten, or twenty times — whatever seems like a reasonably upper limit on the number of words in the fragment.) Now we don’t need to marker any more, and we have an extra hyphen, so we will use a second pattern to clean that up: Find: (?i)(href="[a-zA-Z/-]+\.x?html#)(?-i)[a-z]+?_- Replace: \1 Do a find-and-replace-all, and this will remove the “lower-case-string underscore hyphen” from the start of each fragment: <a href="/premium-classic/before-you-start.xhtml#keeping-lightroom-updated">Keeping Lightroom Updated</a> Regards, Neil Faiman > On Jan 26, 2024, at 6:06 AM, Victoria Bampton <[email protected]> > wrote: > > There's clearly lots of experience here... can anyone tell me if this is > possible to do a find/replace GREP? > > Links like those following are spread throughout a series of documents. I > need to change the bit after the hash (e.g., #sub_InstallingLightroom) to > remove the chunk before the underscore, put a hyphen before each uppercase > character, and change the uppercase to lowercase (e.g., it becomes > #installing-lightroom). That could be multiple finds/replacements, as I can > deal with some of it, but I'm getting stuck on targeting and transforming > those uppercase characters. Is it doable? Any bright ideas would be greatly > appreciated! > > <a > href="/premium-classic/before-you-start.xhtml#sub_InstallingLightroom">Installing > Lightroom</a> > <a > href="/premium-classic/before-you-start.xhtml#box_MultipleComputers">Multiple > Computers</a> > <a > href="/premium-classic/before-you-start.xhtml#sub_KeepingLightroomUpdated">Keeping > Lightroom Updated</a> > <a > href="/premium-classic/managing-your-photos.xhtml#sub_ManagingFoldersInLightroomAndOnTheHardDrive">Managing > Folders in Lightroom and on the Hard Drive</a> > <a > href="/premium-classic/managing-your-photos.xhtml#sub_ChangingTheFolderStructure">Changing > the Folder Structure</a> > > -- > This is the BBEdit Talk public discussion group. If you have a feature > request or need technical support, please email "[email protected]" > rather than posting here. Follow @bbedit on Twitter: > <https://twitter.com/bbedit> > --- > You received this message because you are subscribed to the Google Groups > "BBEdit Talk" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/bbedit/f3743619-5c95-4161-8107-b81affbdd6dan%40googlegroups.com > > <https://groups.google.com/d/msgid/bbedit/f3743619-5c95-4161-8107-b81affbdd6dan%40googlegroups.com?utm_medium=email&utm_source=footer>. -- This is the BBEdit Talk public discussion group. If you have a feature request or need technical support, please email "[email protected]" rather than posting here. Follow @bbedit on Twitter: <https://twitter.com/bbedit> --- You received this message because you are subscribed to the Google Groups "BBEdit Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/bbedit/69E7F7AF-B5EF-4608-A8C2-F70CE41C6329%40faiman.org.
