【问题标题】:Regular Expressions - Select the Second Match正则表达式 - 选择第二个匹配项
【发布时间】:2017-06-08 22:13:04
【问题描述】:

我有一个包含<i></i> 的txt 文件,我想使用Editpad 删除它们

例如,我想在这样的时候保留:

<i>Phrases and words.</i>

我想删除短语中的&lt;/i&gt;&lt;i&gt; 标签,就像这样:

<i>Phrases</i>and<i> words.</i>
<i>Phrases</i>and <i>words.</i>

我试图使用正则表达式来做到这一点,但我做不到。

由于标签后面是空格或单词字符,所以当该行有双标签时,我可以找到

/ <i>|<\/i> /

但这样我不能只按替换,我必须逐行编辑我搜索。

有什么办法可以做到吗?

* 已编辑 *

在字幕文本上找到的另一个示例

<i>- find me on the chamber.</i>
- What? <i>Go. Go, go, go!</i>

【问题讨论】:

    标签: regex replace editpad


    【解决方案1】:

    规则一:你can't parse html with regex

    话虽如此,如果您知道每一行都遵循某种模式,那么您通常可以将某些东西组合在一起工作。 ;)

    如果我理解正确,看起来您可以简单地删除所有不在行首或行尾的&lt;i&gt;&lt;/i&gt;。在这种情况下,您可以尝试的一种方法是以下正则表达式:

    (?<=.)\<\/?i\>(?=.)
    

    这将匹配标签,带有前瞻和后视,以确保我们不在行尾/开头(通过检查前面/后面是否存在另一个字符。(请注意,通常匹配的字符在当您搜索/替换时,lookahead/behind 不会被替换。)

    免责声明:这适用于regex101,但notepad++ 可能与pcre regex 样式有一些差异。

    更新以使用 Editpad

    编辑:由于这个问题实际上是想知道如何在 Editpad 中执行此操作,因此以下是修改后的替代方法:

    尝试搜索正则表达式:(.)\&lt;\/?i\&gt;(.)。这将匹配(并捕获)&lt;i&gt; 标记前后的一个字符。

    替换时,使用backreferences 将整个匹配替换为两个捕获的字符 - 替换字符串\1\2 应该可以工作。

    【讨论】:

    • 感谢您的回复。这是一个字幕文件。不幸的是,它没有用。我正在使用 EditPad 一个与 Notepad++ 类似的程序。我相信这些程序的正则表达式是 javascript 正则表达式样式
    • @Comentarist 为什么你用notepad++ 标记你的问题呢?两种选择:使用 notepad++ 或其他更强大的编辑器来执行此特定操作,或修改此正则表达式以使用 javascript 样式正则表达式(regex101 表示后向不在 js 正则表达式中)
    • 我标记是因为在 notepad++ 上工作的代码也可能在我的身上工作,但事实并非如此。您可以修改此正则表达式以使用 javascript 样式吗?如果可以的话,我会的。
    • 它不能正常工作,但谢谢。我相信我几乎可以像手动一样完成这项工作。有时它在 之前匹配 2 个捕获的字符,并且反向引用 \1\2 替换吃了 1 个字母。由于我的错,我不得不将代码更改为[^- ](.)\&lt;\/?i\&gt;(.),因为与- &lt;i&gt;Text... 的对话行匹配
    • @Comentarist 如果您将[^- ] 部分添加到开头,则可以将其放在第一个括号中以生成([^- ].)...,这样它就不会吃掉第一个字符。
    猜你喜欢
    • 2022-12-06
    • 2015-06-26
    • 2018-05-19
    • 1970-01-01
    • 2014-06-26
    • 2022-01-12
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多