0

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

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

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

谢谢。

4

3 回答 3

3

使用lookbehind 使其变得更加困难,因为允许的匹配受到更多限制。这样做更容易:

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

并将替换为$1"something-replacement"

于 2012-09-10T17:59:13.357 回答
1

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

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

并在RubularRegexHero进行测试。

更新
对于替换,请尝试以下并在此处进行测试

正则表达式:

(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*"([^"]+)"
于 2012-09-10T18:06:23.647 回答
1

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

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

于 2012-09-11T01:57:04.357 回答