正则表达式帮助 - 逗号分隔字符串

时间:2011-06-23 02:05:37

标签: regex vb.net

我没有写很多正则表达式,所以我需要一些帮助。

我需要一个可以验证字符串是字母数字逗号分隔字符串的正则表达式。

示例:

  • 123, 4A67, GGG, 767有效。
  • 12333, 78787&*, GH778无效
  • fghkjhfdg8797<无效

这是我到目前为止所做的,但不是很正确:^(?=.*[a-zA-Z0-9][,]).*$

有什么建议吗?

7 个答案:

答案 0 :(得分:17)

听起来你需要这样一个表达式:

[0-9a-zA-Z]+(,[0-9a-zA-Z]+)*

Posix允许使用更具自我描述性的版本:

[[:alnum:]]+(,[[:alnum:]]+)*
[[:alnum:]]+([[:space:]]*,[[:space:]]*[[:alnum:]]+)*  // allow whitespace

如果您也愿意接受下划线,请搜索整个字词(\w+):

\w+(,\w+)*
\w+(\s*,\s*\w+)*  // allow whitespaces around the comma

(感谢Alan指出我的几个失误!)

答案 1 :(得分:3)

尝试此模式:^([a-zA-Z0-9]+,?\s*)+$

我用你的案例测试了它,以及只有一个数字“123”。我不知道你是否总会有逗号。

[a-zA-Z0-9]+表示匹配这些符号中的一个或多个 ,?表示匹配0或1个逗号(基本上,逗号是可选的) \s*处理逗号后的1个或多个空格 最后,外+表示与模式中的一个或多个匹配。

这也符合 123 123 abc(没有逗号)可能是个问题 这也将匹配123,(以逗号结尾),这可能是一个问题。

答案 2 :(得分:1)

是的,如果您想要捕捉逗号分隔的内容,而最后的逗号合法,并且内容与$LONGSTUFF匹配,则必须重复$LONGSTUFF

$LONGSTUFF(,$LONGSTUFF)*

如果$LONGSTUFF真的很长并且包含逗号重复项本身等,那么手工构建正则表达式而是依靠计算机来做这件事可能是个好主意对你而言,即使它只是通过字符串连接。例如,我只想构建一个正则表达式来验证['1:a=b,c=d','2:e=f,g=h']类型的XEN configuration file的CPUID参数。我......相信这大多符合条例草案:(尽管有空白!)

xend_fudge_item_re = r"""
  e[a-d]x=          #register of the call return value to fudge
  (
    0x[0-9A-F]+ |   #either hardcode the reply
    [10xks]{32}     #or edit the bitfield directly
  )
"""
xend_string_item_re = r"""
  (0x)?[0-9A-F]+:   #leafnum (the contents of EAX before the call)
  %s                #one fudge
  (,%s)*            #repeated multiple times
""" % (xend_fudge_item_re, xend_fudge_item_re)
xend_syntax = re.compile(r"""
  \[                #a list of
   '%s'             #string elements
   (,'%s')*         #repeated multiple times
  \]
  $                 #and nothing else
""" % (xend_string_item_re, xend_string_item_re), re.VERBOSE | re.MULTILINE)

答案 3 :(得分:1)

试试^(?!,)((, *)?([a-zA-Z0-9])\b)*$

分步说明:

  • 不要匹配开头的逗号(有利于即将到来的“循环”)。
  • 匹配可选的逗号和空格。
  • 匹配您喜欢的角色。
  • 单词边界的匹配确保在字符串中堆叠更多参数时需要逗号。

答案 4 :(得分:0)

你似乎缺乏重复。怎么样:

^(?:[a-zA-Z0-9 ]+,)*[a-zA-Z0-9 ]+$

我不确定你是如何在VB.Net中表达的,但在Python中:

>>> import re
>>> x [ "123, $a67, GGG, 767", "12333, 78787&*, GH778" ]
>>> r = '^(?:[a-zA-Z0-9 ]+,)*[a-zA-Z0-9 ]+$'
>>> for s in x:
...    print re.match( r, s )
...
<_sre.SRE_Match object at 0xb75c8218>
None
>>>>

您可以使用快捷方式而不是列出[a-zA-Z0-9 ]部分,但这可能更容易理解。

分析亮点:

  • [a-zA-Z0-9 ]+:捕获一个或多个(但不是零)列出的范围和空格。
  • (?:[...]+,)*:在非捕获括号中,匹配一个或多个字符,最后加上逗号。匹配此类序列零次或多次。捕获零次不允许逗号。
  • [...]+:捕获至少其中一个。这不包括逗号。这是为了确保它不接受尾随逗号。如果尾随逗号可以接受,则表达式更容易:^[a-zA-Z0-9 ,]+

答案 5 :(得分:0)

尝试以下表达式:

/^([a-z0-9\s]+,)*([a-z0-9\s]+){1}$/i

这将适用于:

  1. 测试
  2. 测试,测试
  3. test123,Test 123,test

我强烈建议在逗号分隔列表中的每个项目的开头和结尾处修剪空格。

答案 6 :(得分:0)

请使用 - ^((([a-zA-Z0-9\s]){1,45},)+([a-zA-Z0-9\s]){1,45})$

这里,我将最大字长设置为 45,因为英文最长的字是 45 个字符,可以根据需要更改