【问题标题】:RegExp: check for at least one (unicode) character above code point 0x7f正则表达式:检查代码点 0x7f 上方的至少一个(unicode)字符
【发布时间】:2013-12-18 22:28:26
【问题描述】:

我正在尝试测试一个字符串是否在代码点 0x7f 上方至少包含一个(unicode)字符(即非 ascii 字符)。

我尝试了以下想法(以及其他一些想法),但它们似乎不起作用:

var rx:RegExp;

rx = /[^\\x00-\\x7f]/; // negate ascii code point 0 to 127
trace( rx.test( '\u0080' ) ); // true (expected true)
trace( rx.test( 'b' ) ); // true (expected false)

rx = /[^\u0000-\u007f]/; // negate unicode code point 0 to 127
trace( rx.test( '\u0080' ) ); // false (expected true)
trace( rx.test( 'b' ) ); // false (expected false)

谁能帮我理解为什么这不能按预期工作以及如何正确地做到这一点?

【问题讨论】:

标签: regex actionscript-3 unicode ascii non-ascii-characters


【解决方案1】:
/[^\\x00-\\x7f]/;

双反斜杠表示文字反斜杠,因此您正在寻找一个不包括反斜杠x00 和反斜杠之间的所有字符、x7f.

如果正则表达式在字符串文字中(如new RegExp('[^\\x00-\\x7F]')),则只能使用双反斜杠;几乎正则表达式文字语法/.../ 的全部目的是允许您键入反斜杠繁重的表达式而无需额外的转义层。

'foo'.search(/[^\x00-\x7F]/)!==-1  // false
'bär'.search(/[^\x00-\x7F]/)!==-1  // true

但是:

rx = /[^\u0000-\u007f]/; // negate unicode code point 0 to 127
trace( rx.test( '\u0080' ) ); // false (expected true)

true 在浏览器 JavaScript 中为我服务。如果不是在 ActionScript 中,这似乎是一个不符合 ECMA 的错误。

【讨论】:

  • 我使用双反斜杠的原因是因为这是mentioned in the documentation(多次)。当然仍然可能是错别字。我也觉得他们很奇怪。但是,作为I mentioned in this comment,ActionScript 似乎确实在这方面存在错误。不知何故,ActionScript 似乎不喜欢 \u0000 字符。 \x00 确实工作。
  • 呃!这确实很可悲(错误和文档错误)。
【解决方案2】:

我不确定 AS3 是否像 Python 那样支持 unicode RegExp。 我可以建议以下解决方案,这将帮助你做你想做的事,但我相信长字符串会很慢。

function containsUnicode(text:String):Boolean
{
    for (var i:int = text.length - 1; i >= 0; i--)
    {
        if (text.charCodeAt(i) > 127)
            return true;
    }

    return false;
}

【讨论】:

  • 这是一个不错的选择,但对于长字符串确实可能会变慢。我想我已经解决了这个问题。在查看了您提出的另一个问题后,我使用了不同的范围,看来\u0000 是罪魁祸首。当我将范围更改为 \u0001-\u007f 时,它按预期工作。也许\u0000NUL 字符)默认存在于 AS3 字符串中(在引擎盖下,或者其他什么。我不知道确切)。
  • 很高兴您能解决您的问题,知道解决方案很有趣。您为什么不发布自己的答案来帮助有类似问题的其他人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2013-05-29
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
相关资源
最近更新 更多