简体   繁体   中英

Regular expression to find specific string and add characters when the're not already there in notepad++

Okay, I have zero knowledge of regular expressions so if someone can direct me to a better way to figure this out then by all means please do.

I figured out that a series of files are missing a particular naming convention for the database they will write to. So some might be dbname1, dbname2, dbname3, abcdbname4, abcdbname5 and they all need to have that abc in the beginning. I want to write a regular expression that will find all tags in the file that do not follow immediately by abc and add in abc. Any ideas how I can do this?

Again, forgive me if this is poorly worded/expressed. I really have absolutely zero knowledge of regular expressions. I can't find any questions that are asking this. I know that there are questions asking how to add strings to lines but not how to add only to lines that are missing the string when some already have it.

I thought I had written this in but I'm looking at lines that look like this

<Name>dbname</Name> 

or

<Name>abcdbname</Name> 

and I need to get them all to have that abc at the beginning

Replace \\bdbname(\\d+) with abcdbname\\1 .

The \\b means "word boundary", so it won't match the abc versions, but will match the others. The (...) parentheses represent a capturing group, which capture everything that's matched in-between into a numbered variable that can be later referenced (there's only one here so it goes in \\1 ). The \\d+ matches one or more digit characters.

Cameron's answer will work, but so will this. It's called a negative lookbehind.

(?<!abc)(dbname\d+)

This regex looks for dbname followed by 1 or more digits, and not prefixed by abc. So it will capture dbname113.

This looks for any occurrence of dbname not immediately prefixed by the string "abc". THe original name is in the capture group \\1 so you can replace this regex with abc\\1 and all your files will be properly prefixed.

Not every program/language that implements regex (famously, javascript) supports lookbehinds, but most do and Notepad++ certainly does. Lookarounds (lookbehind / lookaheads) are exceedingly handy once you get the hang of them.

?<! negative lookbehind, ?<= positive lookbehind / lookbehind, ?! negative lookhead, and ?= lookahead all must be used within parantheses as I did above, but they're not used in capturing so they do not create capture groups, hence why the second set of parentheses is able to be referenced as \\1 (or $1 depending on the language)

Edit: Given some better example criteria, this is possibly more what you're looking for.

Find: (<Name>)(.*?(?<!abc)dbname\d+)(</Name>)
Replace: \1abc\2\3

Alternatively, something a bit easier to understand, you can do this or something like this:

Find: (<Name>)(abc)?(dbname\d+)(</Name>)
Replace: \1abc\3\4

What this is does is:

  • Matches <Name> , captures as backreference 1.
  • Looks for abc and captures it, if it's there as backreference 2, otherwise 2 contains nothing. The ? after (abc) means match 0 or 1 times.
  • Looks for the dbname and captures it. and captures as backreference 3.
  • Matches </Name> , captures as backreference 4.

By replacing with \\1abc\\3\\4, you kind of drop abc off dbname if it exists and replace dbname with abcdbname in all instances.

You can take this a step further and

Find: (<Name>)(?:abc)?(dbname\d+)(</Name>)
Replace: \1abc\2\3

prefix the abc with ?: to create a noncapturing group, so the backreferences for replacing are sequential.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM