用其他字符串替换字符串和行的其余部分
Replace string and rest of line with other string
所以这就是我想要做的:
我有一个字符串 origStr,它位于 Word 文档中一行的开头。 origStr 之后是未知值(例如 23 或 2,6)
我想找到那个字符串并将后面的值替换为另一个已知值,但保留该字符串。
我的 Word 文档中的示例:
Diam. diastole, mm: 53
[运行 VBA 用户输入为 54,3 的 makro]
预期结果:
Diam. diastole, mm: 54,3
实际结果:
Diam. diastole, mm: 54,3 53
这就是我得到的:
origStr = LArray(i, j - 1).Caption & ": *"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text
With ActiveDocument.Content.Find
.MatchWildcards = True
.ClearFormatting
.Text = origStr
.Replacement.ClearFormatting
.Replacement.Text = replStr
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindStop
End With
为什么我的旧值没有被删除?
提前致谢!
这不是真正的 VBA 问题,在 "Find and Replace" 对话框中也是如此。
将您的原始字符串替换为:
origStr = LArray(i, j - 1).Caption & ": <*>"
Word 使用 "lazy" 模式匹配,这在这种情况下很好,否则它只会替换整个文档的其余部分。 Vincent G给出了一个单词的解决方案(在该行的其余部分不超过一个space),这里有一些更通用的东西:
要让 Word 替换行尾之前的所有内容,您需要将行尾包含在搜索字符串中。 ^l
或^11
是new line
(shift+enter)的控制码,^12
是page or section break
,^13
是carriage return
.
This 是我找到的最多 "recent" 列表。
所以 "yourtext*^11"
将匹配从 "yourtext"
到下一个 new line
等等的所有内容。
根据您的格式,它可能是上述之一,因此您必须小心。如果您替换 "*^12"
但您的行以 new line
结尾,您将替换整个段落。
要捕获所有这些,您可以将它们分组:yourtext*[^11^12^13]
将匹配所有内容,直到下一个 new line
或 carriage return
。但是,如果我们替换它,行尾也将被替换,因此我们必须将其包含在替换文本中。我们怎么知道那是什么?
我们可以使用 ()
定义子匹配,并使用 </code>、<code>
等在替换文本中使用这些子匹配:
origStr = LArray(i, j - 1).Caption & ": *([^11^12^13])"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text & ""
示例:
之前:
替换为 origStr = "yourtext*([^11^12^13])"
和 replStr = "yourtext newtext"
后:
注意:这些表达式也适用于“查找和替换”对话框,只需确保启用 "Use Wildcards"
所以这就是我想要做的:
我有一个字符串 origStr,它位于 Word 文档中一行的开头。 origStr 之后是未知值(例如 23 或 2,6)
我想找到那个字符串并将后面的值替换为另一个已知值,但保留该字符串。
我的 Word 文档中的示例:
Diam. diastole, mm: 53
[运行 VBA 用户输入为 54,3 的 makro]
预期结果:
Diam. diastole, mm: 54,3
实际结果:
Diam. diastole, mm: 54,3 53
这就是我得到的:
origStr = LArray(i, j - 1).Caption & ": *"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text
With ActiveDocument.Content.Find
.MatchWildcards = True
.ClearFormatting
.Text = origStr
.Replacement.ClearFormatting
.Replacement.Text = replStr
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindStop
End With
为什么我的旧值没有被删除?
提前致谢!
这不是真正的 VBA 问题,在 "Find and Replace" 对话框中也是如此。
将您的原始字符串替换为:
origStr = LArray(i, j - 1).Caption & ": <*>"
Word 使用 "lazy" 模式匹配,这在这种情况下很好,否则它只会替换整个文档的其余部分。 Vincent G给出了一个单词的解决方案(在该行的其余部分不超过一个space),这里有一些更通用的东西:
要让 Word 替换行尾之前的所有内容,您需要将行尾包含在搜索字符串中。 ^l
或^11
是new line
(shift+enter)的控制码,^12
是page or section break
,^13
是carriage return
.
This 是我找到的最多 "recent" 列表。
所以 "yourtext*^11"
将匹配从 "yourtext"
到下一个 new line
等等的所有内容。
根据您的格式,它可能是上述之一,因此您必须小心。如果您替换 "*^12"
但您的行以 new line
结尾,您将替换整个段落。
要捕获所有这些,您可以将它们分组:yourtext*[^11^12^13]
将匹配所有内容,直到下一个 new line
或 carriage return
。但是,如果我们替换它,行尾也将被替换,因此我们必须将其包含在替换文本中。我们怎么知道那是什么?
我们可以使用 ()
定义子匹配,并使用 </code>、<code>
等在替换文本中使用这些子匹配:
origStr = LArray(i, j - 1).Caption & ": *([^11^12^13])"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text & ""
示例:
之前:
替换为 origStr = "yourtext*([^11^12^13])"
和 replStr = "yourtext newtext"
后:
注意:这些表达式也适用于“查找和替换”对话框,只需确保启用 "Use Wildcards"