我正在创建一个小应用程序,它将打开一个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):查找内容包含模式匹配表达式无效”。
我认为这可能与我发送给Word的字符有关,所以我之前用[0-9]交换了\ d。但没有变化。如果我使用[0-9] {16}运行,它会将1234567891012345替换为我想要使用的字符串。
任何人都可以帮助我吗?我是否必须使用许多不同的正则表达式来搜索文档,或者这可以通过一个简单的正则表达式来完成,就像我已经拥有的那样?
答案 0 :(得分:3)
尝试使用\\b
代替\b
。否则,字符串解析器将尝试将ascii代码007
(bell)放入字符串中,您将无法获得匹配。
答案 1 :(得分:1)
你试过转义吗?:
wordapp.Selection.Find.Text = @"\b(?:[0-9][ -]*?){13,16}\b";
如果这不起作用,您需要从一个简单的正则表达式(或实际上只是一个纯文本词)开始,验证它是否有效,然后分阶段建立RegEx。
答案 2 :(得分: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等号码。如有必要,我会添加其他人。
答案 3 :(得分:0)
我的猜测是Word有自己的正则表达式。您是否尝试在Word中打开文档并在“查找和替换”对话框中使用该正则表达式?
实际上,根据http://www.regexinference.com/documentation/Microsoft-Word-Wildcards-as-Regular-Expressions.html,Word不支持非捕获括号,因此您将不得不提出不同的解决方案。
答案 4 :(得分: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(" ", "");
if (Regex.IsMatch(completeSpaceEnterCleanedUpVersion,_creditCardPatternMatchingExpression))
return Regex.Replace(completeSpaceEnterCleanedUpVersion, _creditCardPatternMatchingExpression, "CCXXXXXXXXXXXXXX");
return initiallyCleanedUpData;
}