我正努力在以下文字中的引号之间提取数据:
msgid: "something"
msgidd: "something"
msgid:"something"
msgidd:"something"
msgid: "something"
msgidd: "something"
使用(?<=msgsid:.{1}?)(.+[^"]")
我得到msgid:
之后的内容,但并不总是引号内的内容。我的目标是替换引号内的内容,但保持msgid:
完好无损。任何帮助将不胜感激。
感谢。
答案 0 :(得分:3)
使用lookbehind使得它变得更加困难,因为允许的匹配更加有限。这样做更容易:
(msgid+:\s*)"(.*?)"
将替换为$1"something-replacement"
答案 1 :(得分:1)
为什么你需要一个外观?试试这个:
msgid:\s*"([^"]+)"
<强>更新强>:
对于替换,请尝试以下操作并对其进行测试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。