Question for the RE experts: Consider the following Perl script:
my @lines = (
"Once upon a time in a galaxy far, far away, there lived\n",
"this _idiot_ trying to _mark up_ a few lines of\n",
"marked down text using yet another _language_.\n");
foreach (@lines) {
s|_(.+?)_|<em>$1</em>|g;
print
}
The output of % perl [aboveScript] is
Once upon a time in a galaxy far, far away, there lived
this <em>idiot</em> trying to <em>mark up</em> a few lines of
marked down text using yet another <em>language</em>.
I am trying to achieve this in Java. The class I have come up with follows. It works and I get the same output as above, but I am pretty sure this is not the way to do this. My question - how would you implement the "parseLine()" method?
import java.util.*;
import java.util.regex.*;
public class Reglob {
private final static Pattern emPattern = Pattern.compile ("_(.+?)_");
public void parseLine (String[] lines) {
for (String line : lines) {
List<Integer> bList = new ArrayList<Integer>(),
eList = new ArrayList<Integer>();
Matcher m = emPattern.matcher (line);
int n = 0;
while (m.find()) {
// System.out.println ("Match indices: " + m.start() + ", " + m.end());
bList.add (m.start());
eList.add (m.end());
n++;
}
if (n == 0) {
System.out.println (line);
} else {
String s = line.substring (0, bList.get(0));
for (int i = 0 ; i < n-1 ; i++) {
s += "<em>"
+ line.substring(1+bList.get(i),eList.get(i)-1)
+ "</em>" + line.substring (eList.get(i), bList.get(i+1));
}
s += "<em>"
+ line.substring(1+bList.get(n-1),eList.get(n-1)-1)
+ "</em>" + line.substring (eList.get(n-1), line.length());
System.out.println (s);
}}}
public static void main (String[] args) {
String[] lines = {
"Once upon a time in a galaxy far, far away, there lived",
"this _idiot_ trying to _mark up_ a few lines of",
"marked down text using yet another _language_."};
new Reglob().parseLine (lines);
}}