【问题标题】:Regex negative lookbehind with quantifiers带量词的正则表达式负回溯
【发布时间】:2019-06-10 00:47:14
【问题描述】:

我正在尝试纠正一些 OCR 错误,我需要将 ''(双顶点)替换为 "(引号)。我正在使用 Subtitledit(我认为它使用 C# Regex)。

我每次都需要匹配'',但在这种情况下不需要:

some text 'undefined length phrase/phrases''

第一个 ' 前面应该有一个空格,然后是 \w

如果前面没有\s'\w.*,基本上我想匹配''。 在这个例子中:

''E poi disse: 'Ne voglio un po'', ed andò via.''

我想匹配第一个和最后一个'',但不匹配中间的那个,因为它前面是'Ne voglio un po

我尝试了this,但它不起作用,因为量词不能在后视中使用。

【问题讨论】:

  • 那么,你想要(?<!\S)''\b?见regex101.com/r/jvEqXl/1
  • "不是这种情况" 准确是如何定义这种情况的?你只举了一个例子,可以用多种不同的方式来解释。据我了解,您想替换'',除非那些'' 是文本字符串中的最后两个字符。 (换句话说,您想要替换 ''not 后跟文本结尾。或者换句话说:您想要替换 '' 后跟某个字符。 )
  • 如果前面没有\s'\w.*,我想匹配''

标签: c# regex


【解决方案1】:

您可以将它们都匹配为分隔符。
在您的情况下,您希望将 '' 匹配为 2 个分隔符。

这是怎么做的

查找('')((?:(?:(?!''|'[^']*'')[\S\s])*(?:'[^']*'')?)*)('')
替换"$2"

https://regex101.com/r/Ii0aPe/1

_______________________________________

如果上述方法不适合您,您可以删除第一个 ('') 并运行
它。

更新 - 另外,将中间部分添加到末尾以覆盖对称
结束条件。

注意这个警告:一个只包含'Ne voglio un po''的字符串
将转换为'Ne voglio un po"
当您不使用平衡分隔符时,就会发生这种情况。

查找:((?:(?:(?!''|'[^']*'')[\S\s])*(?:'[^']*'')?)*)('')((?:(?:(?!''|'[^']*'')[\S\s])*(?:'[^']*'')?)*)
替换:$1"$3

https://regex101.com/r/KTYhmq/1

展开

 (                             # (1 start)
      (?:
           (?:
                (?! '' | ' [^']* '' )
                [\S\s] 
           )*
           (?: ' [^']* '' )?
      )*
 )                             # (1 end)
 ( '' )                        # (2)
 (                             # (3 start)
      (?:
           (?:
                (?! '' | ' [^']* '' )
                [\S\s] 
           )*
           (?: ' [^']* '' )?
      )*
 )                             # (3 end)

【讨论】:

  • 这是迄今为止最好的解决方案,但如果第一个 '' 不存在,它就不起作用。 regex101.com/r/Ii0aPe/2
  • @TeodorPatrice - 试试我当时发布的替代方案。 regex101.com/r/PH3FPz/1
  • 我觉得我脑子里放了个屁,没有意识到你给了我一个替代方案。第二个效果很好!惊人的!我需要围绕它来弄清楚你是如何做到的,因为我在制作这个正则表达式时非常努力。非常感谢!
  • @TeodorPatrice - 还有一个更改,您最好检查一下,还有一个警告。
【解决方案2】:

这个表达式很有趣,然后我们将添加一个右侧边界,我们可能会从一个表达式开始,例如:

\s'.+?\w'[^']

Demo 1

如果我们有其他实例,我们当然可以使用额外的约束扩展这个表达式,例如:

\s'[^']+?\w'[^'] 

Demo 2

\s'\w[^']+?\w'[^']

Demo 3

【讨论】:

  • 我实际上想匹配 ''。我更新了原始帖子以使其更清晰。
【解决方案3】:

我决定采用 3 正则表达式解决方案。

  1. 我暂时用我知道在文本中其他任何地方都找不到的字符组合替换了有问题的部分。我选择了§£,比如this
  2. 然后简单地将 '' 替换为 ",例如 this
  3. 最后,替换了§£,所以一切都恢复了原样。喜欢this

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多