匹配字符串EXCEPT在以特定标记开头的行上

时间:2017-01-04 17:40:24

标签: regex search xliff

我不是程序员,所以如果我的问题有点过于基本,我会道歉。

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

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

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

目的是最终在Notepad ++中使用regex find和replace替换这些表达式。

到目前为止,我已经测试了以下表达式(考虑到逗号的逗留时间代替逗号)

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,这很棘手。您可以很容易地将文字中的美元金额与此匹配:

(\$\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