Hi Pavan,
Thanks for your inquiry.
You can achieve your requirement by implementing
IReplacingCallback interface.
Please use the same approach shared at following documentation link to
find and replace the text. See the highlighted code snippet
below.
Hope this helps you. Please let us know if you have any more queries.
public void FindandReplace(Document doc, String regexString, String newText) throws Exception
{
ReplaceEvaluatorTest
obj = new
ReplaceEvaluatorTest();
obj.newText = newText;
Pattern regex =
Pattern.compile(regexString, Pattern.CASE_INSENSITIVE);
doc.getRange().replace(regex,
obj, false);
class ReplaceEvaluatorTest
implements IReplacingCallback
{
public String newText;
@Override
public int
replacing(ReplacingArgs e) throws Exception
{
// This is a Run
node that contains either the beginning or the complete match.
Node currentNode =
e.getMatchNode();
// The first (and
may be the only) run can contain text before the match,
// in this case it
is necessary to split the run.
if (e.getMatchOffset()
> 0)
currentNode =
splitRun((Run)currentNode, e.getMatchOffset());
// This array is
used to store all nodes of the match.
ArrayList
runs = new ArrayList();
// Find all runs
that contain parts of the match string.
int remainingLength =
e.getMatch().group().length();
while (
(remainingLength
> 0) &&
(currentNode != null) &&
(currentNode.getText().length() <= remainingLength))
{
runs.add(currentNode);
remainingLength
= remainingLength - currentNode.getText().length();
// Select the next
Run node.
// Have to loop
because there could be other nodes such as BookmarkStart etc.
do
{
currentNode
= currentNode.getNextSibling();
}
while ((currentNode != null) &&
(currentNode.getNodeType() != NodeType.RUN));
}
// Split the last
run that contains the match if there is any text left.
if ((currentNode != null) &&
(remainingLength > 0))
{
splitRun((Run)currentNode, remainingLength);
runs.add(currentNode);
}
DocumentBuilder builder = new DocumentBuilder((Document)currentNode.getDocument());
builder.moveTo((Run)runs.get(0));
builder.insertField(newText);
//Remove runs
for (Run run : (Iterable)
runs)
{
run.remove();
}
// Signal to the
replace engine to do nothing because we have already done all what we wanted.
return ReplaceAction.SKIP;
}
/**
* Splits text of the
specified run into two runs.
* Inserts the new run
just after the specified run.
*/
private Run splitRun(Run
run, int position) throws Exception
{
Run afterRun =
(Run)run.deepClone(true);
afterRun.setText(run.getText().substring(position));
run.setText(run.getText().substring((0),
(0) + (position)));
run.getParentNode().insertAfter(afterRun, run);
return afterRun;
}
}