0

Word文書を開き、クレジットカード番号(さまざまなパターン)をスキャンし、テキストを置き換え、保存して文書を閉じる小さなアプリケーションを作成しています。

私のコードはかなり単純です:

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Word = Microsoft.Office.Interop.Word;

namespace ParseFilesAndRemoveRegExp
{
    class Program
    {
        static void Main(string[] args)
        {
            FileManagement m = new FileManagement();
            m.OpenSearchAndReplace();
        }
    }

    class FileManagement
    {
        Word.Application wordapp;

        public FileManagement()
        {
            try
            {
                wordapp = new Word.Application();
            }
            catch(Exception ex)
            {
                if (ex != null)
                {
                    string s = ex.ToString();
                }
            }
        }

        internal void OpenSearchAndReplace()
        {
            object nullobj = System.Reflection.Missing.Value;
            try
            { 
                object filename = @"c:\\temp\\document.docx";
                object replaceAll = Word.WdReplace.wdReplaceAll;

                object matchWildCards = true;
                object readOnly = false;
                object isVisible = false;

                Word.Document doc = wordapp.Documents.Open( ref filename, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, 
                                                            ref nullobj, ref nullobj, ref nullobj, ref nullobj,
                                                            ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj);
                doc.Activate();
                wordapp.Selection.Find.ClearFormatting();

                //wordapp.Selection.Find.Text = "[0-9]{16}";
                wordapp.Selection.Find.Text = "\b(?:[0-9][ -]*?){13,16}\b";
                wordapp.Selection.Find.Replacement.ClearFormatting();
                wordapp.Selection.Find.Replacement.Text = "---Cardnumber automatically removed---";

                wordapp.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj, ref matchWildCards,
                                    ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj,
                                    ref replaceAll, ref nullobj, ref nullobj, ref nullobj, ref nullobj);
                doc.Save();
            }
            catch(Exception ex)
            {
                string s = ex.ToString();
                if( wordapp != null )
                {
                    //wordapp.Documents.Close( ref nullobj, ref nullobj, ref nullobj );
                    wordapp.Quit( ref nullobj, ref nullobj, ref nullobj );
                }
            }
        }
    }
}

ただし、実行すると例外が発生します:「System.Runtime.InteropServices.COMException(0x800A15B8):FindWhatテキストに無効なパターン一致式が含まれています」。

これはWordに送った文字と関係があるのではないかと思ったので、以前は\dを[0-9]と交換していました。しかし、変化はありません。[0-9] {16}で実行すると、1234567891012345が使用したい文字列に置き換えられます。

誰かがここで私を助けることができますか?ドキュメントを管理するために、さまざまな正規表現で検索する必要がありますか、それとも、すでに持っているような1つの単純な正規表現で検索できますか?

4

5 に答える 5

3

\\bの代わりに試してください\b。そうしないと、文字列パーサーがASCIIコード007(ベル)を文字列に入れようとし、一致するものが得られません。

于 2010-02-10T08:45:09.220 に答える
1

脱出を試みましたか?:

wordapp.Selection.Find.Text = @"\b(?:[0-9][ -]*?){13,16}\b"; 

それが機能しない場合は、単純な正規表現(または実際にはプレーンテキストの単語)から始めて、それが機能することを確認してから、段階的にRegExを構築する必要があります。

于 2010-02-10T08:49:46.407 に答える
1

非常に簡単な方法でそれを行うと、うまくいくものが得られました。

for (int i = 0; i < 3; ++i)
            { 
                if( i == 0 )
                    wordapp.Selection.Find.Text = "[0-9]{16}";
                else if( i == 1 )
                    wordapp.Selection.Find.Text = "[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}";
                else if( i == 2 )
                    wordapp.Selection.Find.Text = "[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}";

                wordapp.Selection.Find.Execute( ref nullobj, ref nullobj, ref nullobj, ref matchWildCards,
                                                ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj,
                                                ref replaceAll, ref nullobj, ref nullobj, ref nullobj, ref nullobj);
            }

これはあまり良い設定ではありませんが、ちょっと-それは動作します。XXXXXXXXXXXXXXXX、XXXX XXXX XXXX XXXX、XXXX-XXXX-XXXX-XXXXなどの番号を削除しました。必要に応じて追加します。

于 2010-02-10T09:44:21.620 に答える
0

私の推測では、Wordには独自の正規表現があります。Wordでドキュメントを開き、[検索と置換]ダイアログでその正規表現を使用してみましたか?

実際、 http://www.regexinference.com/documentation/Microsoft-Word-Wildcards-as-Regular-Expressions.htmlによると、Wordは非キャプチャ括弧をサポートしていないため、立ち上がる必要があります。別の解決策で。

于 2010-02-10T09:29:50.143 に答える
0

これまでのところ、単一行を超えた最善の解決策として、次のようなものがあります。それはmsワードではありませんが、あなたは確かにあなたが望むものを手に入れることができます。

private const string _creditCardPatternMatchingExpression = @"(?m:-[*]\w{2}\d{15,16})|(?m:CC\w{2}\d{15,16})|(?m:\d{15,16})|(\d{4}-\d{4}-\d{4}-\d{4})|(\d{4}-\d{6}-\d{5})";

        public static string CleanCreditCardData(this String contentThatMayHaveCreditCardData)
    {
        string initiallyCleanedUpData = Regex.Replace(contentThatMayHaveCreditCardData, _creditCardPatternMatchingExpression, "CCXXXXXXXXXXXXXX");
        string completeSpaceEnterCleanedUpVersion = initiallyCleanedUpData.ToLower().Replace("\r\n", "").Replace("\n", "").Replace(" ", "").Replace("-", "").Replace("<br>", "").Replace("<br />", "").Replace("<br/>", "").Replace("&nbsp;", "");
        if (Regex.IsMatch(completeSpaceEnterCleanedUpVersion,_creditCardPatternMatchingExpression))
            return Regex.Replace(completeSpaceEnterCleanedUpVersion, _creditCardPatternMatchingExpression, "CCXXXXXXXXXXXXXX");

        return initiallyCleanedUpData;
    }
于 2011-08-22T20:10:24.660 に答える