【问题标题】:Regex: selecting between quotation marks with positive lookbehind正则表达式:在引号之间选择积极的向后看
【发布时间】:2012-09-10 17:55:42
【问题描述】:

我正在努力提取以下文本中引号之间的数据:

msgid: "something"
msgidd: "something"
msgid:"something"
msgidd:"something"
msgid:      "something"
msgidd:      "something"

使用(?<=msgsid:.{1}?)(.+[^"]"),我得到msgid: 之后的内容,但并不总是引号内的内容。我的目标是替换引号内的内容,同时保持msgid: 不变。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: regex


    【解决方案1】:

    使用lookbehind 使得它变得更加困难,因为允许的匹配更加有限。这样做更容易:

    (msgid+:\s*)"(.*?)"
    

    替换为$1"something-replacement"

    【讨论】:

    • 谢谢。您的示例有效,但是当我将 $1 替换为其他内容时,它会清除“msgid:”。
    • 哦,好的,我现在为此进行了编辑。你能看看它现在是否有效吗?
    • 确实如此,谢谢。我想通过lookbehind事情会变得非常混乱。
    【解决方案2】:

    为什么需要后视?试试这个:

    msgid:\s*"([^"]+)"
    

    并在RubularRegexHero 进行测试。

    更新
    对于替换,请尝试以下并测试它here

    正则表达式:

    (msgid:\s*")[^"]+(")

    替换:

    $1replacementstring$2

    来源:

    msgid: "something"
    msgidd: "something"
    msgid:"something"
    msgidd:"something"
    msgid:      "something"
    msgidd:      "something"
    

    最终字符串:

    msgid: "replacementstring"
    msgidd: "something"
    msgid:"replacementstring"
    msgidd:"something"
    msgid:      "replacementstring"
    msgidd:      "something"
    

    无论如何,如果这是您需要使用后视的挑战,则仅使用以下内容进行匹配。但是在你的替换中使用它是没有意义的。

    (?<=msgid:)\s*"([^"]+)"
    

    【讨论】:

    • 因为当我进行替换时,我想保持“msgid:”(后面有所有可能的空格)完整,并且只更改引号内的内容。您的第一个示例有效,但它消除了“msgid:”。后视的第二个示例不匹配任何内容。
    • 关于后视,你想在哪里匹配这个?记事本++?
    • GSkinner 是基于 perl 的正则表达式引擎,因此不允许在后视中使用量词。 Perl 将后视限制为等宽表达式。我已经修改了正则表达式来捕获somethings。
    • 谢谢。我不知道lookbehinds中的量词。
    【解决方案3】:

    我衷心同意,如果您不需要,您不应该使用lookbehind,但这不是导致您的问题的原因。这是罪魁祸首:.{1}?。您可能希望它在某些输入中匹配可选的第六个字母,例如第二个 d。那将是简单的.?,但大多数正则表达式风格会因为恒定宽度要求而拒绝它。

    .{1}? 的真正含义是完全匹配一个字符,非贪婪,这有点毫无意义,但在语法上是有效的。我测试了几种口味,一半希望他们无论如何都会拒绝它,但它们都匹配.{1}?,就好像它只是.。至于.?,有几种风格(如 .NET 和 Java)可以按照您的意图匹配它,并且您可以在其他风格中使用一些变通方法,但在大多数情况下,最好的解决方案就是不使用往后看。

    【讨论】:

    • 感谢您的解释。实际上,.{1}? 旨在匹配msgid: 之后的任何内容(例如,msgid:"something"msgid: "something"
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2023-03-17
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多