正则表达式无法匹配所有的外国字符。

3
这是我的正则表达式:^([\\p{L}-|a-zA-Z0-9-_]+)$,应该允许所有的外文字符以及数字字母。但由于某些原因,印地语字符无法匹配。
我编写了一个 Xunit 测试来验证。
[Fact]
        public void test()
        {
            var hindiChar = "इम्तहान";
            var input = "12345ABCDPrüfungテスト中文테스트إسرائيل" + hindiChar;
            var regex = "^([\\p{L}-|a-zA-Z0-9-_]+)$";
            Assert.True(new Regex(regex).IsMatch(input));
        }

如果您删除hindiChar,测试将返回true; 但是如果您添加hindiChar,则测试将返回false。

我认为正则表达式的一部分是适配所有外文字符,但不确定为什么它不能匹配印地语字符。


1
众所周知,\p{L} 只匹配 BMP 平面中的字母。你想要匹配变音符号吗?添加 \p{M}。使用 @"^[\p{M}\p{L}-|a-zA-Z0-9-_]+$"。那里的 | 是什么意思?请注意,字符类内部的 | 匹配一个字面上的 | 字符。我认为你想使用 @"^[\p{L}\p{M}0-9_-]+$" - Wiktor Stribiżew
@WiktorStribiżew 谢谢,它起作用了。| 表示 ,就像这个正则表达式允许外文字符或数字。 - superninja
1
好的,[|]不是一个运算符,在这里必须去掉| - Wiktor Stribiżew
1个回答

3

仅使用\p{L}无法匹配单词,您还需要匹配音标符号。可以通过在正则表达式中添加\p{M}来实现。请注意,即使.NET正则表达式中的\w简写“单词”字符类默认也匹配一组音标符号\p{Mn}(非空标记Unicode字符类),请参见这个.NET正则表达式参考资料。但是,在此处,您需要\p{M}来允许任何音标符号。

请注意,字符类中的|将匹配一个字面值的|字符,因此您需要从模式中删除|

看起来您正在使用

@"^[\p{L}\p{M}0-9_-]+$"

它将匹配任何一个或多个字母、变音符号、ASCII数字、_-字符的字符串。
请参见正则表达式演示
请注意,如果您想允许任何Unicode数字字符,则可以使用。
@"^[\w\p{M}-]+$"

See another demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接