使用 VB Script RegExp 对象将 '\uA90F' 形式的 JSON Unicode 转义序列转换为 XML 字符引用

Posted

技术标签:

【中文标题】使用 VB Script RegExp 对象将 \'\\uA90F\' 形式的 JSON Unicode 转义序列转换为 XML 字符引用【英文标题】:Convert JSON Unicode escape sequences of the form '\uA90F' to XML character references using VB Script RegExp object使用 VB Script RegExp 对象将 '\uA90F' 形式的 JSON Unicode 转义序列转换为 XML 字符引用 【发布时间】:2022-01-14 15:02:04 【问题描述】:

我想将 \uA90F 形式的 JSON Unicode 转义序列转换为 &#xA90F&#59; 形式的 XML 字符引用。

下面脚本中的Replace 工作正常,但我不知道如何替换回原始字符串,因此:

Zo\u00EB C\u00E9cile Fran\u00E7oise

变成:

Zoë Cécile Françoise

Dim RegX, InputText, Pattern, ReplacedText

            'Zoe        Francoise       Cecile
InputText = "Zo\u00E2   Fran\u00E7oise  C\u00E9cile"

SearchPattern = "\\u[a-zA-Z0-9]4"

set RegX = New RegExp
RegX.Pattern = SearchPattern
RegX.Global = True

Set Matches = RegX.Execute(InputText)
For Each Match In Matches
    s = Replace(Match, "\u", "&#x") & ";" '<-- ** This works fine **
    MsgBox(s)
Next

【问题讨论】:

帮不上忙,因为我不知道 VBScript,但请注意,这种方法不适用于诸如表情符号之类的“星光”字符——XML 使用包含 unicode 代码的单个转义序列点值,例如 &amp;#x1F600; 而 JSON 编码 UTF-16 代理对的两个部分 \uD83D\uDE00 请upvote/accept以下任何可以解决您问题的答案。 【参考方案1】:

您需要将十六进制字符与[A-Fa-f0-9] 匹配,而不是[a-zA-Z0-9]

此外,您需要围绕需要保留在结果中的模式使用捕获组,并在 RegExp.Replace 方法中使用反向引用(您无需先收集匹配项)。

所以,你可以使用

Dim RegX, InputText, ReplacedText

InputText = "Zo\u00E2   Fran\u00E7oise  C\u00E9cile"

Set RegX = New RegExp
RegX.Pattern = "\\u([a-fA-F0-9]4)"
RegX.Global = True

ReplacedText = RegX.Replace(InputText, "&#x$1;")
  
MsgBox(ReplacedText)

请参阅regex demo。

【讨论】:

正如 MichaelKay 在另一条评论中提到的那样,这种方法不适用于编码的 Unicode 字符 > U+FFFF @RemyLebeau 让我们继续原来的问题:“下面脚本中的替换正在工作,但我不知道如何替换回原字符串"【参考方案2】:

注意:正如 @MichaelKay 在 cmets 中提到的,您尝试做的事情仅适用于 Unicode 字符 U+FFFF。对于更高价值的代码点,代码会变得更复杂一些。

每个Match 都有三个属性:

Value - 搜索字符串中匹配的实际文本。

FirstIndex - 搜索字符串中匹配的第一个字符的从 0 开始的索引。

Length - 匹配字符串的长度。

因此,您确切地知道每个MatchInputText 字符串中的位置。您可以使用该信息创建一个新字符串,其中包含替换的子字符串,例如:

Dim RegX, InputText, SearchPattern, ReplacedText, S, StartIdx, FoundIdx

            'Zoe        Francoise       Cecile
InputText = "Zo\u00E2   Fran\u00E7oise  C\u00E9cile"

SearchPattern = "\\u([a-fA-F0-9]4)"

set RegX = New RegExp
RegX.Pattern = SearchPattern
RegX.Global = True

Set Matches = RegX.Execute(InputText)

StartIdx = 1
ReplacedText = ""

For Each Match In Matches
    S = Replace(Match.Value, "\u", "&#x") & ";"
    MsgBox(S)
    FoundIdx = Match.FirstIndex + 1
    If FoundIdx > StartIdx Then
        ReplacedText = ReplacedText + Mid(InputText, StartIdx, FoundIdx - StartIdx)
    End If
    ReplacedText = ReplacedText + S
    StartIdx = FoundIdx + Match.Length
Next

If StartIdx <= Len(InputText) Then
    ReplacedText = ReplacedText + Mid(InputText, StartIdx)
End If

或者,您可以只使用RegExp.Replace() 方法,就像 @WiktorStribiżew's answer 演示的那样。

【讨论】:

Wiktor 的示例是我使用的示例,它运行良好。 -- 对高价值代码点的注释。谢谢大家的意见。

以上是关于使用 VB Script RegExp 对象将 '\uA90F' 形式的 JSON Unicode 转义序列转换为 XML 字符引用的主要内容,如果未能解决你的问题,请参考以下文章

jQuery文本框输入格式限制valueChange replace光标移动问题

RegExp对象

javaScript基础

初入javascript知识点

JavaScript中RegExp对象

javascript类型系统——正则表达式RegExp类型