我在Regex(C#(方面做得很差,所以我把事情分解成几个部分。以下一系列Regex语句的目标是获取任意字符串,并将其简化为格式"的小写;这是4mg/cc悬浮液的测试;。
这就是我一直在做的事情:
// Test string
string str1 = @" This is 'a' test of 4mg/cc susp ";
// Remove special characters except for space and /
str1 = Regex.Replace(str1, @"[^0-9a-zA-Z /]+", "");
// Remove all but one space from within the string. Trim the ends.
str1 = Regex.Replace(str1.Trim(), @"s+", " ");
// Convert all to lower case
str1 = str1.ToLower();
是否有一个单一的Regex(C#(语句可以完成以上所有内容?
我认为,试图将两种模式合并为一种模式会降低可读性。您可以继续使用对Regex.Replace()
的两个调用,只需将.ToLower()
附加到第二个调用:
// Remove special characters except for space and /
str1 = Regex.Replace(str1, @"[^0-9a-zA-Z /]+", "");
// Remove all but one space, trim the ends, and convert to lower case.
str1 = Regex.Replace(str1.Trim(), @"s+", " ").ToLower();
// ^^^^^^^^^
也就是说,如果你真的必须使用一行,你可以写这样的东西:
str1 = Regex.Replace(str1, @"[^A-Za-z0-9 /]+|( )+", "$1").Trim().ToLower();
这将与否定字符类或中不存在的任何字符匹配一个或多个空格字符,将空格字符置于捕获组中,并将每个匹配替换为组1中捕获的字符(即,无字符或单个空格字符(。
为了完整起见,如果您还想用regex处理修剪(并使模式的可读性更低(,您可以:
str1 = Regex.Replace(str1, @"[^A-Za-z0-9 /]+|^ +| +$|( )+", "$1").ToLower();