从正则表达式范围中排除某些字符

时间:2011-08-20 12:25:27

标签: .net regex unicode

我有一个正则表达式,用于选择unicode范围内的单词

[\u0D80-\u0DFF]*

我想排除包含某个字符的字词,例如\ u0D92。

我该如何更改表达式?

4 个答案:

答案 0 :(得分:2)

建立两个范围;也就是说,在你想要排除的值的范围内留出差距......

[\u0D80-\u0D91\u0D93-\u0DFF]*

答案 1 :(得分:1)

.Net支持Character Class Subtraction的另一种表示法:

[\u0D80-\u0DFF-[\u0D92]]*

示例(使用.Net引擎):http://regexstorm.net/tester

答案 2 :(得分:0)

您可以通过

从字符类中减去字符
[\u0D80-\u0DFF&&[^\u0D92]]*

[a-z&&[^egi]]匹配az之外的所有字符,egi除外。

答案 3 :(得分:0)

使用前瞻来实现集合交集:

(?x)(?:
     (?!\x{d92})
     [\x{d80}-\x{dff}]
)

创建符合您标准的原子。随意取得资格。

我不相信你的\uXXXX符号。当你看到使用它的东西时,它总是一个坏的迹象,因为它是一些古老的Unicode 1遗留符号,它只假设平面0。这意味着它从Unicode 2开始就没那么有用,这可以追溯到上一个千年。如果可能的话,我会避免它,因为你不想陷入不适合16/17的Unicode命名空间的坏习惯。

因此我使用了Java 7,ICU和Perl中使用的标准\x{...}符号,这种符号与Unicode的Planes 1-16不相符。实际上,在使用UTF-16表示的语言中(是的,Java,我正在看着你),这是进行非BMP范围的唯一可能方式。