(1) http://blog1.example.com/roller/ (2) http://blog2.example.com/mt/ (3) http://blog3.example.com/wordpress/
Entries tagged [regex]
jEdit conditional line deleting with regex
TweetPosted on Sunday Jan 31, 2016 at 06:03PM in Technology
How to delete lines that contains a keyword?
Open Search And Replace
dialog and turn Regular expressions
on then put ^.*KEYWORD.*$\n
to Search for
box, leave Replace with
blank then hit Replace All
.
How to delete lines that NOT contains a keyword?
With ^((?!KEYWORD).)*$\n
do the same to the above. for detail check http://stackoverflow.com/questions/406230/regular-expression-to-match-line-that-doesnt-contain-a-word
What are lookahead / lookbehind of regex?
TweetPosted on Sunday Feb 15, 2015 at 10:04AM in Technology
I’m learning regex with Mastering Regular Expressions, 3rd Edition. it’s interesting because long time I didn’t understand lookahead / lookbehind correctly. so I leave some examples for better understanding. tests were ran against jEdit 5.2.0 on Oracle Java 1.8.0_31.
Given string
Positive lookahead
Positive lookahead ensures that the matching has following fragment which matches to given regex inside parenthesis. example\.com(?=/roller/)
matches against only (1)
.
Negative lookahead
Negative lookahead simply reverses that condition. example\.com(?!/roller/)
matches against (2) and (3)
.
Positive lookbehind
Positive lookbehind means that the matching has the preceding fragment which matches to given regex inside parenthesis. (?<=blog1\.)example\.com
matches against only (1)
.
Negative lookbehind
Negative lookbehind simply reverses that condition. (?<!blog1\.)example\.com
matches against (2) and (3)
.
Tags: regex
Complex string replacing on Java
TweetPosted on Tuesday Feb 10, 2015 at 10:06PM in Technology
Sometimes annoying requirement of string replacing will risen. everytime I forgotten how to do it so I leave this as my note. also there’s a JUnit test case.
Requirement
Assume we have following string literals. we have to convert input
string to expected
.
String input = "<li><a href=\"../../jbatch/hello/\" >anchor</a></li>"; String expected = "<li><a href=\"/entry/articles-jbatch-hello\" >anchor</a></li>";
Solutions
Using numbered groups
Pattern p = Pattern.compile("(<a href=\")\\.\\./\\.\\./(.*)/(.*)/\""); Matcher matcher = p.matcher(input); String result = matcher.replaceAll("$1/entry/articles-$2-$3\"");
Using named groups
Pattern p = Pattern.compile("(?<prefix><a href=\")\\.\\./\\.\\./(?<category>.*)/(?<handle>.*)/\""); Matcher matcher = p.matcher(input); String result = matcher.replaceAll("${prefix}/entry/articles-${category}-${handle}\"");
Using Matcher#appendReplacement(). this one is most flexible.
Pattern p = Pattern.compile("(?<prefix><a href=\")(?<url>.*)\""); Matcher matcher = p.matcher(input); StringBuffer sb = new StringBuffer(); while (matcher.find()) { // any complex logic can be placed here String url = matcher.group("url"); String[] urls = url.split("/"); matcher.appendReplacement(sb, "${prefix}/entry/articles-" + urls[2] + "-" + urls[3] + "\""); } matcher.appendTail(sb); String result = sb.toString();
Escaping special character for replacement
$
have special meaning for replacement string, but sometimes we may need to use $
as just a literal. for such case, we can use Matcher.quoteReplacement()
for escaping $
character as follows:
String input = "../../jbatch/hello/"; String expected = "../../$1/${name}/"; Pattern p = Pattern.compile("(?<prefix>\\.\\./\\.\\.)/.*/.*/"); String result = p.matcher(input).replaceAll("${prefix}/" + Matcher.quoteReplacement("$1/${name}") + "/");
Tags: regex