正则表达式不匹配所有外来字符

时间:2018-11-15 18:45:29

标签: c# regex xunit

这是我的正则表达式^([\\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;否则,测试将返回true。但是如果您添加hindiChar,则测试将返回false。

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

1 个答案:

答案 0 :(得分:2)

仅使用\p{L}来匹配单词是不够的,您还需要匹配变音符号。可以通过在正则表达式中添加\p{M}来完成。请注意,即使在默认情况下,.NET正则表达式中的\w速记“单词”字符类也默认与一组变音符号\p{Mn} Mark,Nonspacing Unicode char类别)匹配,请参见this .NET regex reference。但是,在这里您需要\p{M}来允许任何变音符号。

请注意,字符类中的|与文字|字符匹配,因此您需要从模式中删除|

在我看来您使用

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

它将匹配一个或多个字母,变音符号,ASCII数字,_-字符的任何字符串。

请参见regex demo

请注意,如果要允许使用任何Unicode数字字符,甚至可以使用

@"^[\w\p{M}-]+$"

请参见another demo