Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB中通过正则表达式替换处理项目符号以清除XML文件时出错_Xml_Regex_Unicode_Utf 8 - Fatal编程技术网

在VB中通过正则表达式替换处理项目符号以清除XML文件时出错

在VB中通过正则表达式替换处理项目符号以清除XML文件时出错,xml,regex,unicode,utf-8,Xml,Regex,Unicode,Utf 8,我试图清理一个XML文件,使其只包含UTF-8字符,但我遇到了一个要点问题。文件中有一个项目符号,如果我删除这些字符,regex replace的其余部分工作正常,但它似乎没有替换这个特定的项目符号字符。查看十六进制,它是0x07,使用unicode/u0007,但这两种方法都没有解决错误(“十六进制值0x07是无效字符”) 下面是我在多次迭代中使用的一些正则表达式替换代码(SSIS中的VB脚本)。任何帮助都将不胜感激 XMLString = FileIO.FileSystem.Read

我试图清理一个XML文件,使其只包含UTF-8字符,但我遇到了一个要点问题。文件中有一个项目符号,如果我删除这些字符,regex replace的其余部分工作正常,但它似乎没有替换这个特定的项目符号字符。查看十六进制,它是0x07,使用unicode/u0007,但这两种方法都没有解决错误(“十六进制值0x07是无效字符”)

下面是我在多次迭代中使用的一些正则表达式替换代码(SSIS中的VB脚本)。任何帮助都将不胜感激

    XMLString = FileIO.FileSystem.ReadAllText(filelocation)
    'Dim rgx As Regex = New Regex("[\x00-\x08\x0B-\x0C\x0E-\x1F\u0000-\u0007]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[^0-9a-zA-Z]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[[:^print:]]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[[:^print:][\u0007]]", RegexOptions.None)
    Dim rgx As Regex = New Regex("[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[\x00-\x1F\x7F-\xFF]+", RegexOptions.None)
    rgx.Replace(XMLString, "")

谢谢

您需要知道的是,正则表达式是针对字节字符串还是字符字符串应用的。(在perl中有一个明显的区别,对VB不太确定——它通常由您读取数据的方式控制)。以下两点不是“规则”本身,更是好形式

  • 如果针对字节运行,则应仅使用
    \xXX
    转义序列。(和XX只能是2位数字)
  • 如果针对字符运行,则应使用转义序列(\xXXXX在大多数语言中都是相同的)
看看你的未注释正则表达式,你似乎在看字符。这意味着该文件必须已经采用某种有效的字符编码(可能是UTF-8、UTF-16LE或cp1252中的一种)。因此,这个正则表达式所做的一切就是剥离出有效的UTF-8字符,这是XML规范所不允许的。那应该很好

但是如果您的字符串是字节流,并且您试图确保它是有效的UTF-8,那么使用正则表达式就很难做到这一点。除了非ascii码,我不知道怎么做


还有一点:在进行替换之前,您不应该设置正则表达式的全局属性吗。这可能是你的问题吗?它修复了第一次出现而不是整个文件?

您需要知道的是正则表达式是针对字节字符串还是字符字符串应用的。(在perl中有一个明显的区别,对VB不太确定——它通常由您读取数据的方式控制)。以下两点不是“规则”本身,更是好形式

  • 如果针对字节运行,则应仅使用
    \xXX
    转义序列。(和XX只能是2位数字)
  • 如果针对字符运行,则应使用转义序列(\xXXXX在大多数语言中都是相同的)
看看你的未注释正则表达式,你似乎在看字符。这意味着该文件必须已经采用某种有效的字符编码(可能是UTF-8、UTF-16LE或cp1252中的一种)。因此,这个正则表达式所做的一切就是剥离出有效的UTF-8字符,这是XML规范所不允许的。那应该很好

但是如果您的字符串是字节流,并且您试图确保它是有效的UTF-8,那么使用正则表达式就很难做到这一点。除了非ascii码,我不知道怎么做


还有一点:在进行替换之前,您不应该设置正则表达式的全局属性吗。这可能是你的问题吗?它修复了第一次出现,但不是整个文件?

使用Powershell时,我使用了以下正则表达式:

    -replace "\u2022", "" `

正如@Brian Reichle在您对Powershell的评论中提到的,我使用了以下正则表达式:

    -replace "\u2022", "" `

正如@Brian Reichle在您的评论中所提到的,我认为项目符号的unicode字符是\u2022,\u0007是“Bell”字符。您好,我(目前:-)不知道为什么x07字符会出现问题,但您的两个正则表达式定义中似乎有一个输入错误:写“[^[:print:]”而不是“[:^print:]”'并再次尝试使用此模式。最好的问候,carstenI认为项目符号的unicode字符是\u2022,\u0007是“Bell”字符。您好,我不知道为什么x07字符会出现问题,但您的两个正则表达式定义中似乎有输入错误:写“[^[:print:]”而不是“[:^print:]”,然后再次尝试使用此模式。向你问好,卡斯滕