我有一个Javascript正则表达式,用于对句子中的单词进行标记,如下所示:
/\\[^]|\.+|\w+|[^\w\s]/g
如果像
Hello World.
那样输入句子,就像上面的正则表达式一样 将其标记为单词:
Hello
,World
,.
我正在尝试在C#中转换上述正则表达式,但它无法对其进行分组。我尝试分别从开头和结尾删除/
和\g
,以使其与.NET正则表达式引擎兼容。但它仍然无效。
以下是我正在尝试的C#代码:
public static void Main()
{
string pattern = @"\\[^]|\.+|\w+|[^\w\s]";
string input = @"hello world.";
foreach (Match m in Regex.Matches(input, pattern, RegexOptions.ECMAScript))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
有人可以帮助我将上述正则表达式转换为C#吗?
答案 0 :(得分:3)
请注意,RegexOptions.ECMAScript
只是确保速记字符类(此处为\w
和\s
)仅匹配ASCII字母,数字和空格。您不能指望此选项“转换”整个模式以在.NET正则表达式库中使用。
这里,在JS regex中使用[^]
构造来匹配任何char。您可以将.
与RegexOptions.Singleline
选项一起使用(然后必须删除RegexOptions.ECMAScript
选项)而不是[^]
,或者只是使用[\s\S]
匹配任何字符:
public static void Main()
{
string pattern = @"\\.|\.+|\w+|[^\w\s]";
string input = @"hello world.";
foreach (Match m in Regex.Matches(input, pattern, RegexOptions.Singleline))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
请参阅C# demo,其输出:
'hello' found at index 0.
'world' found at index 6.
'.' found at index 11.
注意:\w
和\s
在.NET regex中具有Unicode感知功能,所有Unicode字母都与某些变音符号相匹配。如果您只想处理ASCII,请使用
string pattern = @"\\.|\.+|[A-Za-z0-9_]+|[^A-Za-z0-9_\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]";
更多详情
\w
\s