C# 如何使用正则表达式验证带空格的逗号分隔字符串

C# 如何使用正则表达式验证带空格的逗号分隔字符串,c#,.net,regex,string,C#,.net,Regex,String,我需要使用正则表达式验证逗号分隔的字符串,但我有两个问题 我的示例输入如下: ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7 - Valid ERW SW1,ERW SW2,ASA,S4,ERW SW5,ERW SW6,ERWSW7 - Valid(space between word should valid) ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7, - Invalid - Comma at end ,ER

我需要使用正则表达式验证逗号分隔的字符串,但我有两个问题

我的示例输入如下:

ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7 - Valid

ERW SW1,ERW SW2,ASA,S4,ERW SW5,ERW SW6,ERWSW7 - Valid(space between word should valid)

ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7, - Invalid - Comma at end

,ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7 - Invalid - Comma at beginning

ERWSW1,ERWSW2,,ASA,S4,ERWSW5,ERWSW6,ERWSW7 - Invalid - No value between 2,3 comma
我编写了以下正则表达式来验证输入

^([a-z A-Z0-9 !@#$%?=*&-]+,)*[a-z A-Z0-9 !@#$%?=*&\s-]+$
第一个问题是当逗号之间的空格显示为有效字符串时

Eg: ERWSW1, ,   ,ERWSW2,ASA,S4
我需要避免,我怎么做

我的第二个问题是,我还需要从字符串中删除额外的空间。两个删除我需要的额外空间函数。(这与上面的正则表达式无关

我需要以下输出

RWSW1,ERW SW2,ASA,S4,ERW SW5,ERWSW6,ERWSW7
更新:

对于第二个问题,我编写了以下代码

string str = " ERW SW1 , ERW SW2 , ASA";
var ss = Regex.Replace(str, " *, *", ",");
但是它没有正确地删除空格,我需要这个输出

ERW SW1,ERW SW2,ASA

可以使用字符类指定允许匹配的内容。对于单词之间的空格,可以使用前面带有空格的重复组

^[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*(?:,[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*)*$

要删除逗号周围的空格,可以匹配包含空格和逗号的字符串
*,*
,然后用单个逗号替换由空格包围的逗号

^ *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*(?: *, *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*)* *$
|

代码示例

输出


为什么是正则表达式?这是作业吗?使用
string.Split
解决这个问题非常简单<代码>变量值=input.Split(',');var validFormat=!value.Any(i=>string.IsNullOrWhiteSpace(i))@InBetween regex appraoch还允许检查所有值是否为有效字符,以及是否没有值是有效字符empty@InBetween我需要用正则表达式验证第一个问题,第二个问题可以是任何问题,先生。是的,这是我工作的一部分assignment@CertainPerformance你也可以用split做同样的事情,我也看不出你暗示的限制。这是一项任务,尽管讨论这个问题没有用。第一个问题已经解决了很多次。例如删除逗号周围的空格也是一个常见问题,请参阅。这是哪个问题,先生?你能解释一下吗。对于这两个问题,我需要两个单独的答案,问题是当输入为
ERWSW1、ERWSW2、ASA时。您的代码显示为无效输入。我需要允许它,但需要使用另一个函数重新移动额外的空格您可以将模式与空格匹配,然后替换空格
^\w+(?:\w+)*(?:*,*\w+(?:\w+)*)*$
,然后使用空字符串可以使整个模式成为可选的好的,先生,谢谢您的帮助
^ *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*(?: *, *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*)* *$
string[] strings = {
    "ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7",
    "ERW SW1,ERW SW2,ASA,S4,ERW SW5,ERW SW6,ERWSW7",
    "ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7,",
    ",ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7",
    "ERWSW1,ERWSW2,,ASA,S4,ERWSW5,ERWSW6,ERWSW7",
    "ERWSW1 ,  ERW SW2,ASA ,S4 ,ERW SW5,ERWSW6,ERWSW7",
    "ERW*SW1,ERW-SW2,A.SA",
    " ERWSW1 , ERWSW2 ,ASA,S4,ERWSW5 "
};

string pattern = @"^ *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*(?: *, *[\w!@#$%?=*&.-]+(?: [\w!@#$%?=*&.-]+)*)* *$";

foreach (String s in strings) {
    if (Regex.IsMatch(s, pattern)) {
        Console.WriteLine(Regex.Replace(s, " *, *", ",").Trim());
    }
}
ERWSW1,ERWSW2,ASA,S4,ERWSW5,ERWSW6,ERWSW7
ERW SW1,ERW SW2,ASA,S4,ERW SW5,ERW SW6,ERWSW7
ERWSW1,ERW SW2,ASA,S4,ERW SW5,ERWSW6,ERWSW7
ERW*SW1,ERW-SW2,A.SA
ERWSW1,ERWSW2,ASA,S4,ERWSW5