【问题标题】:Why is this simple text replacement code not working?为什么这个简单的文本替换代码不起作用?
【发布时间】:2014-01-03 17:16:35
【问题描述】:

在 *.docx 文件中使用这样的文本:

I scream.  You scream.  We all scream for ice cream.

I scream.You scream.We all scream for ice cream.

...(IOW,第一种情况下句子之间有两个空格,第二种情况下没有空格)我想在句子之间强制一个并且只有一个空格,所以它最终是这样的:

I scream. You scream. We all scream for ice cream.

I scream. You scream. We all scream for ice cream.

但是这段代码:

// 65..90 are A..Z; 97..122 are a..z
const int firstCapPos = 65;
const int lastCapPos = 90;
const int firstLowerPos = 97;
const int lastLowerPos = 122;

    . . .

// This will change sentences like this: "I scream.You scream.We all scream of ice cream." ...to this: "I scream. You scream. We all scream of ice cream."
private void SpacifySardinizedLetters(string filename)
{
    using (DocX document = DocX.Load(filename))
    {
        for (int i = firstCapPos; i <= lastCapPos; i++)
        {
            char c = (char)i;
            string originalStr = string.Format(".{0}", c);
            string newStr = string.Format(". {0}", c);
            document.ReplaceText(originalStr, newStr);
        }
        for (int i = firstLowerPos; i <= lastLowerPos; i++)
        {
            char c = (char)i;
            string originalStr = string.Format(".{0}", c);
            string newStr = string.Format(". {0}", c);
            document.ReplaceText(originalStr, newStr);
        }
        document.Save();
    }
}

// This will change sentences like this: "I scream.  You scream.  We all scream of ice cream." ...to this: "I scream. You scream. We all scream of ice cream."
private void SnuggifyLooseyGooseySentenceEndings(string filename)
{
    using (DocX document = DocX.Load(filename))
    {
        for (int i = firstCapPos; i <= lastCapPos; i++)
        {
            char c = (char)i;
            string originalStr = string.Format(".  {0}", c);
            string newStr = string.Format(". {0}", c);
            document.ReplaceText(originalStr, newStr);
        }
        for (int i = firstLowerPos; i <= lastLowerPos; i++)
        {
            char c = (char)i;
            string originalStr = string.Format(".  {0}", c);
            string newStr = string.Format(". {0}", c);
            document.ReplaceText(originalStr, newStr);
        }
        document.Save();
    }
}

...仅适用于紧缩在一起的句子-它们之间有两个空格的句子无法更改。为什么?我的代码或 docx 库中是否存在错误?

【问题讨论】:

  • 了解如何使用调试器。这不是免费的调试服务。
  • 你尝试了什么?添加日志记录,例如查看您要替换的内容。你真的调用了用{. {0}替换. {0}的方法吗?你能提供一个重现问题的小例子吗?所以:创建一个带有类似Foo. Bar 的句子的.docx 文件,并验证替换工作只调用document.ReplaceText(". B", ". B");。您需要隔离问题。
  • 我通过了它,它看起来不错;它根本不会用一个替换两个空格。
  • 是的,我正在调用该方法 - 我在其中设置了一个断点。在我的文档中,no-space-between-them 句子会按应有的方式进行更改,但 two-spaces-beween-them 句子不会。

标签: c# char docx spaces novacode-docx


【解决方案1】:

你可以用正则表达式来代替:

using System.Text.RegularExpression;

string text = readFromDocx();
string newText = Regex.Replace( text, @"\.[^\S\n]*(\w)",
    m => string.Format( ". {0}", m.Groups[ 1 ] ) )

双重否定旨在匹配除换行符之外的所有空格,通常包含在\s 说明符中。

【讨论】:

  • 这是否适用于 .docx 文件,替换文档中的所有内容?
  • @B.ClayShannon text 是一个字符串变量,该方法也返回一个字符串,因此如果您能够将文本作为字符串读取并将结果写回文件,它将起作用
  • 我认为这行不通,因为 DOCX 库没有线条的概念。也许最简单的解决方案是手动将所有“”替换为“”。
  • @B.ClayShannon 这应该不是问题
【解决方案2】:

我按照我在comment 中所说的做了,下载了DocX,创建了一个 Microsoft Word 文档并从引用 DocX 库的项目中运行了这段代码:

// Contains "Foo.Bar and Foo.  Bar"
string filename = "TestWordDocument.docx";

using (DocX document = DocX.Load(filename))
{
    document.ReplaceText(".B", ". B");
    document.ReplaceText(".  B", ". B");
    document.Save();
})

还有Word文件,之前包含:

Foo.Bar and Foo.  Bar

之后包含:

Foo. Bar and Foo. Bar

所以,对我有用。

编辑:我在包含您问题的第一行的文件上运行了您的代码,并且它有效。您确定您正在运行此代码并且正在查看正确的文件吗?

【讨论】:

  • 很奇怪;有了一个新文件,它现在对我有用。第一个(不起作用的)包含我从 Visual Studio 粘贴到 Word 中的文本,这是非工作 docx 和工作 docx 之间的唯一区别。
  • @B.ClayShannon 很乐意为您提供帮助。
  • 文本拆分为多个运行时可能不起作用?解压你的 docx 并查看 document.xml 中的 XML
【解决方案3】:

试试这个 docX.Replace() 代码,很容易将文本从某个文本更改为另一个文本。

static void Replace(string filename, string a, string b)
    {
        using (DocX document = DocX.Load(filename))
        {
            document.ReplaceText(a, b);

            document.Save();
        } 
    }

【讨论】:

  • 此答案或多或少与@CodeCaster 发布的已接受答案重复。
猜你喜欢
  • 2013-05-04
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多