使用正则表达式创建分隔文本

时间:2013-04-11 16:37:12

标签: regex excel ms-word

我有一个词汇表,其中的条目以粗体显示,而解释性文本是常规字体。我想做的是在每个粗体文本后添加一个逗号(星号或任何其他标点符号),这样我就可以将术语表转换为Excel中逗号分隔的文本。有没有办法在Word的查找和替换对话框中使用正则表达式执行此操作,因此我可以在单词或短语的末尾添加逗号,这是词汇表中的条目。以下是词汇表中的一个条目作为示例:

废除生效 ....常规字体条目的内容..

该条目是粗体短语,与其相关的解释以常规文本形式给出。

尝试表达< [A-Za-z \,.-)(/ \?!] {1,}> 后,Jerry在“查找”框中提示并 ^ &,在MS Word的替换框中,我得到了粗体短语的所需结果,后面跟着段落和标题:


http://img811.imageshack.us/img811/6338/frontpagep.jpg


但词汇表条目没有发生任何变化,因为它们后面跟着条目的内容,后面没有分段。以下是词汇表中的示例,显示词汇表条目的特征布局:


http://img571.imageshack.us/img571/6558/samplefromtheglossary.jpg


3 个答案:

答案 0 :(得分:0)

使用通配符,将格式字体设置为粗体。要进行搜索,请输入<*>。要进行替换,请输入^&,Picture is worth a thousand scripts

答案 1 :(得分:0)

一些简单的搜索显示以下文档至少适用于旧版本的Word-2002。

office support document

请注意,Word的Regex实现与其他人的实现不太一致。

我没有看到更新版Word的文档。 Visual Studio中的搜索和替换(我认为这也适用于免费版本),或者像Eclipse这样的IDE确实支持Regex,因此您可以使用许多非Word选项。

答案 2 :(得分:0)

你可以尝试一下这个:

<[A-Za-z\,\.\-\)\(\/\?\! ]{1,}>

而不是之前建议的<*>乔治的建议?

对OP进行新编辑:

您可以尝试将其放入宏中:

Sub CommaAdder()
    Selection.Find.ClearFormatting
    Selection.Find.Font.Bold = True
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "<[A-Za-z]@>"
        .Replacement.Text = "^&,"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = ",([\)])"
        .Replacement.Text = "\1,"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = ",([\-\?\/\!\.\, ])"
        .Replacement.Text = "\1"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = "([A-Za-z]@ )"
        .Replacement.Text = "\1,"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = "( \,)([A-Za-z]@)"
        .Replacement.Text = ", \2"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = "\,\("
        .Replacement.Text = "("
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = "\, "
        .Replacement.Text = " "
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
    With Selection.Find
        .Text = " \,"
        .Replacement.Text = ", "
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    Selection.Find.Execute Replace:=wdReplaceAll
    End With
End Sub

我不知道如何编写宏,但是我记录了一个替换来构建它,如果你理解了一点,就会有3个替换继续进行。第一个查找所有粗体单词并在它们之间加上逗号,即使有).等等。第二个看起来专门针对我刚刚提到的删除该逗号的实例,以及那些我们有一个逗号后跟一个粗体空格,的地方,但,)部分除外,它在最后一次替换中被解决,而是替换为),

问题在于,如果你有类似的东西:

  

这是粗体但不是

boldbut之间的空格也具有bold格式,它将在第二次替换时删除。如果有一种方法可以找到部分为粗体而部分不是粗体的文本,则不会有任何问题。我正在尝试寻找解决方案,但如果此代码存在任何问题,请告诉我。如果没有像这样格式化为粗体的空格,则不会有任何问题!

reEDIT:现在这也适用于大胆的空间!虽然它不太整洁......