我无法使它正常工作。
场景:字幕,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
答案 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>