【问题标题】:How do I check for this odd space character - " " in Objective-C?如何在 Objective-C 中检查这个奇怪的空格字符 - “ ”?
【发布时间】:2013-08-01 16:05:38
【问题描述】:

我写了一些正则表达式来处理字符串中的空格,它工作得很好,除了当我遇到这个字符时:“ ”而不是“”。你可能认为我疯了,但显然他们是不同的。看看这个 RegEx 应用程序(奇怪的是,它经常崩溃):

当我使用奇怪的空间时:

当我使用普通空间时:

如您所见,这里检测到更多空格,但它没有检测到奇怪的空格。

这个空间是什么?我该如何摆脱它?

【问题讨论】:

  • 您帖子中的空格相同的。你能发布正确的(大概是 unicode)吗?
  • 您必须在十六进制模式下查看原始文本到 ASCII 数字。
  • 有许多 ascii 字符没有可见的字符艺术(基本上看起来像一个空格),而不是实际的空格 (ascii 32) 字符。
  • 我猜它是某种类型的 Unicode 空间,比如不间断空间 (U+00A0)。
  • 看起来你有一些文字处理的散文。您看到的奇怪空间是否可能是不间断的空间。所以也许你的 wp 或文本布局应用程序有一个特殊的空格字符,不会被行尾替换。例如,短语“加起来成为电影明星”可能会分成两行,但奇怪的空格是说“to”和“a”之间不应该发生换行符。我不知道您使用什么应用程序来创建文本,但也许该应用程序中有一个设置不包括这些不间断的空格。哎呀,杰弗里·托马斯比我早几秒钟输入了相同的回复。

标签: objective-c regex nsregularexpression


【解决方案1】:

Unicode 有很多不同的space characters。您在问题中发布的空间——在标题和正文中——是一个常规的 ASCII 空间,好旧的 U+0020。

如果您想准确检查您复制到剪贴板上的内容,您可以在 Mac OS X 上运行命令 pbpaste(1)。例如,如果您复制了不间断空格 (U+00A0),您可以像这样识别它:

# Write pasteboard contents to stdout, convert from UTF-8 to UTF-32 for easy
# code point identification, then hex dump the contents
$ pbpaste | iconv -f utf-8 -t utf-32be | hexdump -C
00000000  00 00 00 a0                                       |....|
00000004

根据您使用的正则表达式引擎,它可能无法全部支持,特别是如果您使用\s 字符类。如果您想确保匹配您拥有的空格字符,则将其明确包含在您的字符类中,例如[\s<YOURSPACEHERE>],其中<YOURSPACEHERE> 是从您要匹配的字符复制+粘贴的。

【讨论】:

  • 根据那个命令确实是a0,谢谢。我会尝试 [\s...] 建议。 :)
  • 嘿,Xcode 甚至似乎有一个特殊的符号。 i.imgur.com/a6G4gQO.png
【解决方案2】:

尝试使用“\p{Z}”作为您的正则表达式。它是任何类型的空格或不可见分隔符的 unicode 属性。

请参阅:NSRegularExpressionUnicode Regular Expressions


为了测试我的答案,我构建了以下单元测试。

- (void)testPattern
{
    NSString *string = @"xxx\u00A0yyy";
    NSString *pattern = @"\\p{Z}";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];

    NSUInteger number = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])];
    STAssertEquals(number, 1U, @"");
}

【讨论】:

  • 放弃 PHP 正则表达式。
  • 抱歉,不是一个完整的想法,在 Objective-C 中,我的意思是。
【解决方案3】:

它们可能是不间断的空格,因为所有行都以与 \s 匹配的空格结尾,而不是这些神秘的空格。尝试匹配\0xA0

【讨论】:

  • 抱歉,它是 A0,但无论出于何种原因,应用程序都找不到它。
【解决方案4】:

您可以将 Unicode 字符与 \x{NNNN} 匹配,其中 NNNN 是字符的十六进制代码。见ICU User Guide

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多