Dear Oliver,
Your solution works!!!!!, so my regular expression:
<replaceregexp byline = "false" flags = "mg"
file="${sql.dir}/oracle/lra-create-index-oracle.sql"
match="[EMAIL PROTECTED](\) ]*;"
replace=";">
</replaceregexp>
eats the multi-lines.
I don't understand well why you need to put two times the ) as you have
commented. In my cas it works as above.
Thank a lot,
David
Oliver Ashoff <[EMAIL PROTECTED]> wrote:
Hello David!
Sorry, my explanation was a little bit short, I guess. ;)
I wondered --- as you --- that the replaceregexp works fine in
(1) one-line-mode
but not in
(2) multi-line mode.
So, let's see what is the difference of the inputs!
Outline:
(1) <any character sequence without any line feed><an optional line
feed>
(2) <any character sequence without any line feed><a line feed>
<any character sequence without any line feed><a line feed>
....
<any character sequence without any line feed><an optional line
feed>
So, I thought the 'line feed's could be the problem because not all line
feeds are equal :)
To be more precise, not all 'line end markers' (charcters or character
sequences that mark the end of a line) are equal.
For an explanation for 'line feed' see
http://en.wikipedia.org/wiki/Line_Feed
How to insert a 'line feed' in a regular expression?
I tried --- as you--- '\n'. But that did not help.
The problem could be that the line end marker used in the input are 2
characters!
For example: <carriage return><line feed>=<ASCII 13><ASCII 10>
Hence, inserting an extra ASCII 10 encoded as " " in the regular
expression solved
the problem! Hurra! :)
For 'Numerical Character References' see
http://www.w3.org/MarkUp/html3/latin1.html ( Line feed)
Example: Consider the following lines of an input file:
<entry name="statistics.enabled">
<value>true</value>
</entry>
Now, we want to replace the string "true" by "false". But this should be done
only for the entry "statistics.enabled". So, I use a regular expression that
matches the above three line:
<replaceregexp byline="false" flags="m">
<regexp
pattern="(.*<entry.*name="statistics.enabled".*>.* .*<value>).*(</value>.* .*</entry>.*$)"
/>
<substitution expression="\1false\2" />
<fileset dir="${etc.dir}" includes="config.xml" />
</replaceregexp>
As you can see, I inserted 2 times the sequences
so that the 'line breaks' are recognized. Without that it does not work.
Additionally, I use further 'Numerical Character References' for the
characters '<' and '>'.
I guess, you got now the crucial point. ;)
I did not investigate your regular expression because I mean that you know
you regular expression
and you only missed the trick with the " " character seqence to insert.
I dont know if there is an other solution, perhaps a smarter one.
But this is at least an acceptable work-around for me.
If you dont succeed let me know. Then, I try to give you further assitance...
;)
Cheers, Oliver
---------------------------------
Von: David [mailto:[EMAIL PROTECTED]
Gesendet: Donnerstag, 18. Mai 2006 16:50
An: Oliver Ashoff; Ant Apache User Group
Betreff: Re:How to use replaceregexp in multi-line context?
Dear Oliver,
Thanks for your interest on my problem. Concerning to your comment, I don't
understand wery will, please could you be a little bit more explicit.
As far as I understand, I think you mean to include the new line character on
the match expression. I was tested this too, without success, so:
<replaceregexp byline = "false" flags = "g"
file="${sql.dir}/oracle/lra-create-index-oracle.sql"
match="[EMAIL PROTECTED](\)\n]*;"
replace=";">
doesn't work, so adding the \n character. I have tested to using the java
property
${line.separator}, so:
<replaceregexp byline = "false" flags = "g"
file="${sql.dir}/oracle/lra-create-index-oracle.sql"
match="[EMAIL PROTECTED](\)${line.separator}]*;"
replace=";">
both solutions compiles with Ant, but the input file doesn't change.
I have a simple example that work on multi-line context, but I don't have to
specify the list of allowed characters on the match expression:
<replaceregexp byline = "false" flags = "gs">
<regexp pattern = "${CVI.begin}(.*)${CVI.end}"/>
<substitution expression =
"${CVI.begin}${nl}${CVI.body.java}${CVI.end}"/>
<fileset dir = ".">
<exclude name="**/*.properties"/>
<patternset refid = "java.patternset"/>
</fileset>
</replaceregexp>
where:
CVI.begin = @BEGIN_CONTROL_VERSION_INFO@
CVI.end = @END_CONTROL_VERSION_INFO@
and ${nl} = ${line.separator}, with this peace of code the delete the
contains of the CVI block code, for example:
@BEGIN_CONTROL_VERSION_INFO@
Control Version Information
================================================================================
$Log: DynamicInstance.java,v $
Revision 1.4 2004/10/04 19:24:03 UF367151
Checkstyle test passed.
Revision 1.3 2004/09/14 17:56:48 UF367151
================================================================================
@END_CONTROL_VERSION_INFO@
for this case is easy because the end token is at new line and it is a string
instead of character like my case(";"), so we can specify the "s" flag and
"eat" every thing with .* pattern (including the new line because the "s"
option stays that)
Please let me know any suggestion about that,
Thanks,
David
---------------------------------
Be a chatter box. Enjoy free PC-to-PC calls with Yahoo! Messenger with Voice.
---------------------------------
Love cheap thrills? Enjoy PC-to-Phone calls to 30+ countries for just 2ยข/min
with Yahoo! Messenger with Voice.
---------------------------------
Sneak preview the all-new Yahoo.com. It's not radically different. Just
radically better.