Visual Studio Regex Find and Replace `new vtk[...]()` to `vtk[...].New()` - regex

I am trying to replace all the places where we instantiate a VTK object like this: new vtk[...](); with this pattern: vtk[...].New().
The Find regex I'm using is: new vtk\w, but I don't know what the replacement regex should be. How would I do this?
For Example
... = new vtkPoints(); should turn into ... = vtkPoints.New();

Find new vtk\[(.+)\]\(\);
Replace with vtk[$1].New();
Explanation:
We must escape characters in the FIND string, if they are regex operators. Thus, \( means capture a (, \] means capture a ] etc..
We capture the content using (.+) meaning capture at least one of any character (. matches all characters), so that we can use it in the replace string.
in the REPLACE string, we use $1, which means the content of the first capture group
Edit: if you want to support new vtk(); without anything inside the parantheses, replace (.+) with (.*), which means at least 0, instead of at least 1
Edit 2: misread your question a bit, you need new vtk(\w+)\(\) with vtk$1.New()

Related

Regular Expression (notepad++) insert, not replace

In a regular expression (notepad++), I want to search for:( )|(:)|(_)|(\.), and to insert \ before to, as above, a blank space, colon, under line and ".".
Search example: abcd:1234 jiod.8ufd_adfd
Result: abcd\:1234\ jiod\.8ufd\_adfd
Briefly, how can I refer to what was found in the replace expression?
Note that it is not \1, \2, \3 or \4 in the example, as I need to include what was found, there is no way to know which was found, is there?
You can use a single character class (instead of using the alternation with capturing groups) to match one of the listed
In the replacement use $& to refer to the matched text and prepend a backslash.
Match
[:\h._]
Replace with
\\$&
The character class matches either a colon, horizontal whitespace char, dot or underscore.
Regex demo
There's no such thing as insert, because if you think about it, inserting is just replacing the original with a new string that contains the old text as well.
Try this instead: search for ([ :_.]) (your original regex is pointlessly complicated) and replace with \\$1 (ie, slash followed by the original text).

Regex transform for Java code with Notepad++ - date .format to SimpleDateFormat

I need to do some re-factoring on my Java code. I need to turn this:
X.format("Z")
into this:
(new SimpleDateFormat("Z").format(X))
Examples:
dateStart.format("yyyy-MM-dd HH:mm") into
(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(dateStart))
reportStart.format("yyyy-MM") into
(new SimpleDateFormat("yyyy-MM").format(reportStart))
I'm thinking to use Notepad++ find/replace, but I'm not good with Regex, and hoping someone would know easily?
I've tried variations of the below, and the closest I've got is with the one below... But with the one below, it wants to take everything to the left of .format and treat that as $1
find:([^)]*)\.format\(([^)]*)\) replace with:
(new SimpleDateFormat($2.format($1))
Probably a simple find / replace will work like this :
Find (?s)(\w+)\.format\((.*?)\)
update Escape the parenthesis when used as literals because Boost::regex uses these characters as special operators in the replacement, format string.
Boost-Extended format strings treat all characters as literals except for '$', '\', '(', ')', '?', and ':'
Replace \(new SimpleDateFormat\($2\).format\($1\)\)
https://regex101.com/r/f77yBt/1
If interested in why certain characters need to be escaped to be considered
literals, see this :
https://www.boost.org/doc/libs/1_70_0/libs/regex/doc/html/boost_regex/format/boost_format_syntax.html
Essentially, boost::regex uses these characters to implement a pseudo-callback
that does simple (possibly nested) conditionals checking if a group matched
and taking a yes : no replacement action.
Be aware that in Notepad++ the parenthesis have to be escaped in the replacement part.
Ctrl+H
Find what: (\w+)\.format\((.+?)\)
Replace with: \(new SimpleDateFormat\($2\).format\($1\)\)
CHECK Match case
CHECK Wrap around
CHECK Regular expression
UNCHECK . matches newline
Replace all
Explanation:
(\w+) # group 1, 1 or more word characters
\. # a dot
format\( # literally
(.+?) # group 2, 1 or more any character but newline, not greedy
\)
Screen capture (before):
Screen capture (after):

Remove everything after second colon

I need to remove everything after the colon following orange
Example:
apple:orange:banana:grapes:
Becomes:
apple:orange
I've looked up a million different references for this and cannot find a solution.
Currently doing this in Notepad++ using the Find/Replace function.
Find what : (^[a-z]+:[a-z]+).*$
(^[a-z]+:[a-z]+) First capturing group. Match alphabetic characters at start of string, a colon, alphabetic characters.
.*$ Match anything up to the end of the string.
Replace with : \1
\1 Replace with captured group one.
You could of course make the expression more general:
Find what : (^[^:]+:[^:]+).*$
(^[^:]+:[^:]+) Capturing group. Match anything other than a colon at start of string, a colon, anything other than a colon.
.*$ Match anything up to end of string.
Replace with : \1
\1 Replace with captured group one.
As pointed out by revo in the comment below, you should disable the matches newline option when using the patterns above in Notepad++.
If I understand you correctly, you can use the plugin ConyEdit to do this. You can use its command cc.dac <nth>/<regex>/[<mode>] [-options]. cc.dac means: delete after column.
For Example:
With ConyEdit running in the background, copy the text and the command line below, then paste:
apple:orange:banana:grapes:
cc.dac 2/:/ -d
How big is the file?
If it's a small file, you could probably write a simple code something like following snippet in java. Most the programming languages would support such operations.
String input = "apple:orange:banana:grapes:";
String[] arrOfStr = input.split(":");
int index = arrOfStr.indexOf("orange");
String[] arrOfStrSub = Arrays.copyOf(arrOfStr, 0, index);
String output = StringUtils.join(arrOfStrSub, ':');

Find and replace parts of matched string in Notepad++

I have something in a text file that looks like '%r'%XXXX, where the XXXX represents some name at the end. Examples include '%r'%addR or '%r'%removeA. I can match these patterns using regex '%r'%\w+. What I would like to replace this with is '{!r}'.format(XXXX). Note that the name has to stay the same in the replace so I'd get '{!r}.format(addR) or '{!r}.format(removeA). Is there a way to replace parts of the matched string in this way while retaining the unknown variable name pulled out with \w+ in the regex search?
I'm specifically looking for a solution using the find and replace features in Notepad++.
You can use
'%r'%(\w+)
and replace with '{!r}.format\(\1\)
The '%r'%(\w+) pattern contains a pair of unescaped parentheses that create a capturing group. Inside the replacement pattern, we use a \1 backreference to restore that value.
NOTE: The ( and ) in the replacement must be escaped because otherwise they are treated as Boost conditional replacement pattern functional characters.
See more on capturing groups and backreferences.
Search on:
'%r'%(XXXX)
Replace with:
Whatever You like \1
\1 will match the first set of grouping parentheses.

What REGEX pattern should I use to look for a specific string pattern and remove anything else that doesnt match?

I'm parsing through code using a Perl-REGEX parsing engine in my IDE and I want to grab any variables that look like
$hash->{ hash_key04}
and nuke the rest of the code..
So far my very basic REGEX doesnt do what I expected
(.*)(\$hash\-\>\{[\w\s]+\})(.*)
(
\$
hash
\-\>
\{
[\w\s]+
\}
)
I know to use replace for this ($1,$2,etc), but match (.*) before and after the target string doesnt seem to capture all the rest of the code!
UPADTED:
tried matching null but of course thats too greedy.
([^\0]*)
What expression in regex should i use to look only for the string pattern and remove the rest?
The problem is I want to be left with the list of $hash->{} strings after the replace runs in the IDE.
This is better approached from the other direction. Instead of trying to delete everything you don't want, what about extracting everything you do want?
my #vars = $src_text =~ /(\$hash->\{[\w\s]+\})/g;
Breaking down the regex:
/( # start of capture group
\$hash-> # prefix string with $ escaped
\{ # opening escaped delimiter
[\w\s]+ # any word characters or space
\} # closing escaped delimiter
)/g; # match repeatedly returning a list of captures
Here is another way that might fit within your IDE better:
s/(\$hash->\{[\w\s]+\})|./$1/gs;
This regex tries to match one of your hash variables at each location, and if it fails, it deletes the next character and then tries again, which after running over the whole file will have deleted everything you don't want.
Depends on your coding language. What you want is group 2 (The second set of characters in parenthesis). In perl that would be $2, in VIM it would be \2, etc ...
It depends on the platform, but generally, replace the pattern with an empty string.
In javascript,
// prints "the la in ing"
console.log('the latest in testing'.replace(/test/g, ''));
In bash
$ echo 'the latest in testing' | sed 's/test//g'
the la in ing
In C#
Console.WriteLine(Regex.Replace("the latest in testing", "test", ""));
etc
By default the wildcard . won't match newlines. You can enable newlines in its matching set using a flag depending on what regex standard you're using and under what language/api. Or you can add them explicitly yourself by defining a character set:
[.\n\r]* <- Matches any character including newline, carriage return.
Combine this with capture groups to grab desired variables from your code and skip over lines which contain no capture group.
If you want help constructing the proper regex for your context you'll need to paste some input text and specify what the output should be.
I think you want to add a ^ to the beginning of the regex s/^.(PATTERN)(.)$/$1/ so that it starts at the beginning of the line and goes to the end, removing anything except that pattern.