我没有写很多正则表达式,所以我需要一些帮助。
我需要一个可以验证字符串是字母数字逗号分隔字符串的正则表达式。
示例:
123, 4A67, GGG, 767
有效。 12333, 78787&*, GH778
无效fghkjhfdg8797<
无效这是我到目前为止所做的,但不是很正确:^(?=.*[a-zA-Z0-9][,]).*$
有什么建议吗?
答案 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
这将适用于:
我强烈建议在逗号分隔列表中的每个项目的开头和结尾处修剪空格。
答案 6 :(得分:0)
请使用 - ^((([a-zA-Z0-9\s]){1,45},)+([a-zA-Z0-9\s]){1,45})$
这里,我将最大字长设置为 45,因为英文最长的字是 45 个字符,可以根据需要更改