正则表达式:在具有正向外观的引号之间进行选择

时间:2012-09-10 17:55:43

标签: regex

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

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

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

感谢。

3 个答案:

答案 0 :(得分:3)

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

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

将替换为$1"something-replacement"

答案 1 :(得分:1)

为什么你需要一个外观?试试这个:

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"

无论如何,如果这是一个需要使用lookbehind的挑战,那么只能使用下面的匹配。但是在替换中使用它是没有意义的。

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

答案 2 :(得分:1)

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

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