我正在寻找将字符串添加到现有字符串的最佳方法,而我不想替换整个字符串.
self.fields_desc.append(BitField("foo", 0x3, 4))
Run Code Online (Sandbox Code Playgroud)
可以替换为:
self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))
Run Code Online (Sandbox Code Playgroud)
使用哪种工具可以让我尽可能少地解决这个问题?在vim我能做到:
:%s/self.fields_desc.append(BitField("[a-zA-Z0-9]*", 0x[0-9]*, [0-9]*))/self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))/g
Run Code Online (Sandbox Code Playgroud)
但我不知道如何告诉vim不要替换我写的正则表达式.你能帮我个忙吗?
使用捕获组(注意"("和")"之前的"\",以及"\ 1","\ 2"等):
:%s/self\.fields_desc\.append(BitField(\("[a-zA-Z0-9]*"\), \(0x[0-9]\+\), \([0-9]\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g
Run Code Online (Sandbox Code Playgroud)
变化:
self.fields_desc.append(BitField("foo", 0x3, 4))
self.fields_desc.append(BitField("test", 0x5, 3))
Run Code Online (Sandbox Code Playgroud)
至
self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))
self.fields_desc.append(BitField("test" + str(self.__class__.i), 0x5, 3))
Run Code Online (Sandbox Code Playgroud)
注意:
*用+数字匹配替换了:我怀疑你想匹配self.fields_desc.append(BitField("foo", 0x,)等self.fields_desc.append(BitField("foo", 0x3...有时候并不总是这样,self.fields_desc.append(BitField("foo",0x3或者在空格字符self.fields_desc.append(BitField("foo", 0x3之后添加一个*.虽然我建议使用标准化代码.正如sidyll所说,学习使用内置字符类"\ d","\ w"(参见速记字符类)等可能更好:
:%s/self\.fields_desc\.append(BitField(\("\w*"\), \(0x\d\+\), \(\d\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g
Run Code Online (Sandbox Code Playgroud)
这既简洁又可读.另外,读者会认为你有一些特殊的理由来定义你自己的角色类(也就是说,他们会读两遍以确保那里没有一些未知的角色).