Reputation: 15
Hivemind!
I am trying to edit Memsource *.mxliff files with Notepad++.
When I create a search task, both source and target lines mix up in a huge list.
But I need to make amendments only for lines inside <target>.../<target>
tags.
For example:
1. <target>от 15 до 35 °C</target>
2. <target>Допустимый диапазон температур воздуха от -40 °C до +70 °C {1>1)<1}</target>
Inside these lines I need to replace all instances of degrees with a non-breaking space version:
Find: (\d) °C
Replace with: $1 $2
What is the most optimal way to do so?
Any hints would be much appreciated. Thanks a lot!
Upvotes: 1
Views: 1230
Reputation: 430
Short alternative as always ....
Find what: (\d+) (?=°C)
Replace all with: $1NBSP
Done!
Upvotes: 0
Reputation: 91385
(?:<target>|\G)(?:(?!target)[\s\S])*?\K(\d+)\s*(°C)(?=.*</target>)
$1 $2
. matches newline
Explanation:
(?: # non capture group
<target> # opening tag
| # OR
\G # restart from last match position
) # end group
(?:(?!target)[\s\S])*? # 0 or more any character but not "target"
\K # forget all we have seen until this position
(\d+) # group 1, 1 or more digits
\s* # 0 or more spaces
(°C) # group 2
(?=.*</target>) # must be followed by </target>
Replacement:
$1 # content of group 1 (i.e. the temperature)
# non breaking space
$2 # content of group 2 (i.e. °C)
Screen capture (before):
Screen capture (after):
Upvotes: 3
Reputation: 27723
Assuming that we'd have one °C
in a target tag, maybe some expression similar to:
(<\s*target\s*>[\s\S]*?\d)\s+(°C[\s\S]*?<\s*\/target\s*>)
and replaced with,
$1$2
might be OK to look into.
If you wish to simplify/update/explore the expression, it's been explained on the top right panel of regex101.com. You can watch the matching steps or modify them in this debugger link, if you'd be interested. The debugger demonstrates that how a RegEx engine might step by step consume some sample input strings and would perform the matching process.
Upvotes: 1