在正则表达式中使用 Unicode 块
Working with Unicode Blocks in Regex
我正在尝试添加一项功能,该功能适用于字符串中的某些 unicode 组。我发现 this question 建议以下解决方案,它确实适用于规定范围内的 unicodes:
s = Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty);
这很好用。
不过,在我的研究中,我遇到了 use of unicode blocks,我发现它更具可读性。
InBasic_Latin = U+0000–U+007F
更多时候,我看到建议指出人们自己使用实际代码 (\u0000-\u007F
) 而不是这些块 (InBasic_Latin
)。当您需要该块的某些子集或特定的 unicode 时,我可以看到显式声明范围的好处,但是当您真的只想使用块声明对整个分组进行分组时,使用块名称似乎对可读性甚至可编程性更友好相反。
所以,一般来说,我的问题是为什么 \u0000–\u007F
被认为是比 InBasic_Latin
更好的语法?
这取决于您的正则表达式引擎,但有些引擎(如 .NET、Java、Perl)确实支持 Unicode 块:
if (Regex.IsMatch(subjectString, @"\p{IsBasicLatin}")) {
// Successful match
}
其他代码点没有(例如 JavaScript、PCRE、Python、Ruby、R 和大多数其他代码点),因此您需要手动拼出这些代码点或使用扩展名 Steve Levithan's XRegExp library for JavaScript.
我正在尝试添加一项功能,该功能适用于字符串中的某些 unicode 组。我发现 this question 建议以下解决方案,它确实适用于规定范围内的 unicodes:
s = Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty);
这很好用。
不过,在我的研究中,我遇到了 use of unicode blocks,我发现它更具可读性。
InBasic_Latin = U+0000–U+007F
更多时候,我看到建议指出人们自己使用实际代码 (\u0000-\u007F
) 而不是这些块 (InBasic_Latin
)。当您需要该块的某些子集或特定的 unicode 时,我可以看到显式声明范围的好处,但是当您真的只想使用块声明对整个分组进行分组时,使用块名称似乎对可读性甚至可编程性更友好相反。
所以,一般来说,我的问题是为什么 \u0000–\u007F
被认为是比 InBasic_Latin
更好的语法?
这取决于您的正则表达式引擎,但有些引擎(如 .NET、Java、Perl)确实支持 Unicode 块:
if (Regex.IsMatch(subjectString, @"\p{IsBasicLatin}")) {
// Successful match
}
其他代码点没有(例如 JavaScript、PCRE、Python、Ruby、R 和大多数其他代码点),因此您需要手动拼出这些代码点或使用扩展名 Steve Levithan's XRegExp library for JavaScript.