RegEx:检查第一行中是否存在斜体结束标记

时间:2018-10-02 15:49:13

标签: regex

我无法使它正常工作。 场景:字幕,SRT格式。如果两行中的第一行包含开头斜体标签<i>,并且文本的斜体部分延伸到第二行,则第一行在其末尾需要结束标签</i>,第二行开头的<i>开头标签。

方法:如果在第1行中找到<i>,请查看该行中是否有结束标记。如果是,则什么也不做,否则,将{1减去其换行符)替换为line1</i>\n<i>

这是我尝试过的:

查找:(.*<i>.*(?!.*</i>.*\n))\n
替换为:$1<i/>\n<i>

问题:尽管在第1行中,在开始标记之后有一个结束标记的实例,但这给出了一个匹配项。

第1行和第2行是下面各块中的文本行,因此请忽略包含数字和时间码的行。

示例材料:

1
00:00:01,000 --> 00:00:03,320
<i>Alle meine Entchen
schwimmen auf dem See</i>

2
00:00:04,240 --> 00:00:06,880
<i>Köpfchen</i> in das Wasser
Schwänzchen in die <i>Höh</i>.

3
00:00:06,960 --> 00:00:08,960
<i>(Musik endet ♪,</i>
<i>Männerstimme, Englisch:)</i>

1:应该在第1行的结尾处得到一个结束标记,并在第2行的开始处得到一个开始标记

2和3:不应被视为匹配项,并且应单独放置

任何帮助将不胜感激。 最好,

Ingo

2 个答案:

答案 0 :(得分:0)

您很近,前瞻性很差。这是使用JS识别开头为<i>且后面没有相应的结尾</i>的行的方法:

// this should not modify the string, as it
// contains the closing </i> element
console.log(
  "this <i>is a</i> test".replace(/(?!<i>.+<\/i>)(<i>.+$)/g, '$1</i>')
);

// this one should modify the string, appending
// the closing </i> to the end
console.log(
  "this <i>is a test".replace(/(?!<i>.+<\/i>)(<i>.+$)/g, '$1</i>')
);

这是根据要求的Python演示:

>>> import re;

>>> print(re.sub(r'(?!<i>.+<\/i>)(<i>.+$)', r'\1</i>', "this <i>is a</i> test"))
this <i>is a</i> test

>>> print(re.sub(r'(?!<i>.+<\/i>)(<i>.+$)', r'\1</i>', "this <i>is a test"))
this <i>is a test</i>

答案 1 :(得分:0)

感谢大家的出色投入。它帮助我构建了以下解决方案,该解决方案也适用于像这样的打开标签的第二个实例

<i>Köpfchen</i> in <i>das Wasser
Schwänzchen in die Höh</i>.

=>

<i>Köpfchen</i> in <i>das Wasser</i>
<i>Schwänzchen in die Höh</i>.

并且它没有引入任何新的换行符。

step1

(?m)(?<=<i>(?!.*</i>).*$?)\r   => </i>

step2

(?m)^(?=.*(?<!<i>.*)</i>.*\r?$) => <i>