【问题标题】:How to validate comma separated string with space using Regex如何使用正则表达式验证带空格的逗号分隔字符串
【发布时间】:2020-05-12 07:19:34
【问题描述】:

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

我的示例输入如下,

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

我需要避免这种情况,我该怎么做?

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

Input: ERWSW1 ,  ERW SW2,ASA ,S4 ,ERW SW5,ERWSW6,ERWSW7

我需要以下输出,

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

【问题讨论】:

  • 为什么是正则表达式?是任务吗?使用string.Split 很容易解决这个问题。 var values = input.Split(','); var validFormat = !values.Any(i => string.IsNullOrWhiteSpace(i));
  • @InBetween 正则表达式方法还允许检查所有值都是有效字符,并且没有值是空的
  • @InBetween 我需要使用正则表达式验证第一个问题,先生,第二个问题可以是任何问题。是的,这是我的任务的一部分
  • @CertainPerformance 你也可以对 split 做同样的事情,我也看不到你似乎暗示的限制。这是一项任务,所以讨论这个问题没有用。
  • 第一个问题已经解决了很多次了,here is my answer。例如。删除逗号周围的空格也是一个常见问题,请参阅this thread

标签: c# .net regex string


【解决方案1】:

您可以使用一个字符类来指定您允许匹配的内容。对于单词之间的空格,您可以使用以空格开头的重复组。

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

Regex demo

要删除逗号周围的空格,您可以匹配包含空格和逗号 *, * 的字符串,然后将逗号替换为一个逗号。

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

Regex demo | C# demo

代码示例

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

【讨论】:

  • 这是什么问题,先生?你能解释一下吗?先生,我需要两个单独的答案来解决这两个问题
  • 问题是当输入为ERWSW1 ,ERWSW2 ,ASA 时,您的代码显示为无效输入。我需要允许它,但需要使用另一个函数删除多余的空格
  • 您可以将模式与空格匹配,然后将空格^\w+(?: \w+)*(?: *, *\w+(?: \w+)*)*$替换为空字符串regex101.com/r/KP7q7W/1
  • 您可以将整个模式设为可选 regex101.com/r/UfzxTh/1
  • 好的,谢谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2020-08-24
  • 1970-01-01
  • 2011-03-28
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多