匹配以特定标记开头的行上的字符串除外

Matching strings EXCEPT on lines starting with a specific tag

我不是程序员,所以如果我的问题有点太基础,我深表歉意。

我是一名翻译,并且有一个 xliff(对于我们的目的,纯文本)文档,其结构大致如下:

<source>For workers in the rest of the state, the minimum wage will increase to .70 at the end of 2016, then another .70 each year after until reaching .50 on 12/31/2020 – after which the minimum wage will continue to increase to  on an indexed schedule.</source>
<target>Для работников остальной части штата минимальная ставка оплаты труда поднимется до ,70 в конце 2016 года, а затем будет расти на [=10=],70 ежегодно, достигнув размера в ,50 31 декабря 2020 года, после чего минимальная ставка будет продолжать повышаться до  на основании графика.</target>

我正在尝试捕获 <target> 段中美元金额的所有实例,因此美元符号后跟一个或两个数字,可选地后跟一个逗号和另外两个数字。

目的是在 Notepad++ 中使用正则表达式查找和替换最终替换这些表达式。

到目前为止,我已经测试了以下表达式(考虑到代替逗号的杂散句点)

($\d+(\,|\.)?\d*\d*)

它返回了所有美元金额,包括 <source> 部分中的金额。根据我在这里的搜索,我尝试使用 lookbehinds 排除这些,但未能获得所需的结果。我不会与您分享我失败的尝试。

实现此目标的好方法是什么?

谢谢!

好吧,这很棘手。很容易将文本中的美元金额与此匹配:

($\d+(?:(?:\.|,)\d{2})?)

但是如果你只想在某个点之后匹配,你可以匹配它之前的东西然后用\K把它扔掉。所以这将匹配所有 source 内容和开头的 target 标签:

<source>.*?</source>\s*<target>\K

然后,由于我们添加了 \K,它将从那里开始匹配。现在,通过在我们的美元符号捕获组之前添加一个 .*?,我们将能够捕获第一组内容。然而,如果你想捕获不止一个东西,你将需要递归第一个模式。您可以使用 (?1) 语法来做到这一点。这将重复第一个捕获组。

如果你把它们放在一起,你会得到这样的结果:

<source>.*?</source>\s*<target>\K(?:.*?)($\d+(?:(?:\.|,)\d{2})?)|((?1))

希望这能让您朝着正确的方向前进。

Here is a demo