开发者

Replacing char in a String with Regular Expression

I got a string like this:

开发者_StackOverflowPREFIX-('STRING WITH SPACES TO REPLACE')

and i need this:

PREFIX-('STRING_WITH_SPACES_TO_REPLACE')

I'm using Notepad++ for the Regex Search and Replace, but i'm shure every other Editor capable of regex replacements can do it to.

I'm using:

PREFIX-\('(.*)(\s)(.*)'\) 

for search and

 PREFIX-('\1_\3') 

for replace but that replaces only one space from the string.


The regex search feature in Notepad++ is very, very weak. The only way I can see to do this in NPP is to manually select the part of the text you want to work on, then do a standard find/replace with the In selection box checked.

Alternatively, you can run the document through an external script, or you can get a better editor. EditPad Pro has the best regex support I've ever seen in an editor. It's not free, but it's worth paying for. In EPP all I had to do was this:

search: ((?:PREFIX-\('|\G)[^\s']+)\s+

replace: $1_


EDIT: \G matches the position where the previous match ended, or the beginning of the input if there was no previous match. In other words, the first time you apply the regex, \G acts like \A. You can prevent that by adding a negative lookahead, like so:

((?:PREFIX-\('|(?!\A)\G)[^\s']+)\s+

If you want to prevent a match at the very beginning of the text no matter what it starts with, you can move the lookahead outside the group:

(?!\A)((?:PREFIX-\('|\G)[^\s']+)\s+

And, just in case you were wondering, a lookbehind will work just as well as a lookahead:

((?:PREFIX-\('|(?<!\A)\G)[^\s']+)\s+


You have to keep matching from the beggining of the string untill you can match no more.

find /(PREFIX-\('[^\s']*)\s([^']*'\))/

replace $1_$2

like: while (/(PREFIX-\('[^\s']*)\s([^']*'\))/$1_$2/) {}


How about using Replace all for about 20 times? Or until you're sure no string contains more spaces


Due to nature of regex, it's not possible to do this in one step by normal regular expression.

But if I be in your place, I do such replaces in several steps:

  1. find such patterns and mark them with special character (Like replacing STRING WITH SPACES TO REPLACE with @STRING WITH SPACES TO REPLACE@
  2. Replace @([^@\s]*)\s to @\1_ server times.
  3. Remove markers!


I studied a little the regex tool in Notepad++ because I didn't know their possibilities.

I conclude that they aren't powerful enough to do what you want.

Your are obliged to learn and use a programming language having a real regex capability. There are a number of them. Personnaly, I use Python. It would take 1 mn to do what you want with it


You'd have to run the replace several times for each space but this regex will work

/(?<=PREFIX-\(')([^\s]+)\s+/g

Replace with

\1_ or $1_

See it working at http://refiddle.com/10z

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜