"abc"] StringReplace-6ren">
gpt4 book ai didi

regex - Unicode 字符串上的 Mathematica 正则表达式

转载 作者:行者123 更新时间:2023-12-05 00:07:00 25 4
gpt4 key购买 nike

这是一次迷人的调试体验。
你能看出以下两行之间的区别吗?

StringReplace["–", RegularExpression@"[\\s\\S]" -> "abc"]
StringReplace["-", RegularExpression@"[\\s\\S]" -> "abc"]

当您评估它们时,它们会做非常不同的事情。事实证明,这是因为第一行中被替换的字符串由 unicode 短划线组成,而不是第二行中的普通旧 ascii 破折号。

对于 unicode 字符串,正则表达式不匹配。
我的意思是正则表达式“[\s\S]”表示“匹配任何字符(包括换行符)”,但 Mathematica 显然将其视为“匹配任何 ascii 字符”。

如何修复正则表达式,使上面的第一行与第二行的计算结果相同?或者,是否有我可以先应用于字符串的 asciify 过滤器?

PS:Mathematica 文档说它的字符串模式匹配建立在 Perl 兼容的正则表达式库( http://pcre.org )之上,所以我遇到的问题可能不是 Mathematica 特有的。

最佳答案

这是我最初用作解决方法的 asciify 函数:

f[s_String] := s
f[x_] := FromCharacterCode[x]

asciify[s_String] :=
StringJoin[f /@ (ToCharacterCode[s] /. x_?(#>255&) :> "&"<>ToString[x]<>";")]

然后我意识到,感谢@Isaac 的回答,那个“。”因为正则表达式似乎没有这个 unicode 问题。我从 Bug in Mathematica: regular expression applied to very long string 的答案中学到了那个“(.|\n)”是不明智的,但是那个“(?s)”。被推荐。所以我认为最好的解决方法如下:
StringReplace["–", RegularExpression@"(?s)." -> "abc"]

关于regex - Unicode 字符串上的 Mathematica 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com